mac 配置host 使得任意域名指向本地服务


在工作中,常常会有这样的需求,更新了一个功能模块,需要在正式环境下测试,主要是在网络请求的同源策略的情况,比如常见的ajax跨域问题,iframe 跨域问题
这时候,可以在 mac 修改 host,让我的浏览器在进入 https://example.com/ 这个域名时指向本地,或者是任意你在本地跑的服务, 比如 http://localhost:3000 之类的。 一般来说,修改某个域名直接指向本地服务是简单的,但是如果是https的情况,由于浏览器安全策略限制,浏览器会报ssl配置错误(ERR_SSL_PROTOCOL_ERROR ),就需要申请证书,绑定本地端口解析等等。整个流程还是比较复杂的。下面给出一些具体实践流程(如果是windows或linux的操作系统,可以按照相对应的方法修改host和解析nginx,申请证书,大致的逻辑是类似的)。

A. 我们假设本地跑的服务为 http://localhost:3000, 首先,我们要修改host文件使得在浏览器中输入 https://example.com/, 或者 http://example.com/ ,解析host时时指向本地服务

  1. 打开终端,输入以下命令以编辑hosts文件:
    sudo vi /etc/hosts
    
  2. 添加这行到文件中。这行的意思是将example.com域名解析到本地IP地址127.0.0.1。
    127.0.0.1   example.com
    
  3. 保存并推出。
    :wq
    
  4. 为了让更改立即生效,可能需要刷新本地DNS缓存。在终端中输入以下命令:
    sudo killall -HUP mDNSResponder
    
    至此修改host结束。这时在本地进入 https://example.com, https://example.com 时会转到本地。但是不出意外页面会报错。原因很简单,因为此时等于直接转到了本地的80 和 433端口,这两个端口目前还没有服务嘛

B. 接下来,先申请ssl用,443端口要走本地服务需要用到,也就是解析https需要的证书

在这里我们用到的是一个叫 mkcert 的工具,可以看官方文档安装。这里简单写一下步骤
  1. 先安装homebrew,homebrew 是 Mac OS平台下的软件包管理工具,同样的,如果已经装过跳过此步

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
  2. 用homebrew安装mkcert

    # 安装包
    brew install mkcert
    # 生成 https 证书
    mkcert luffyZh.handsome.com
    

    生成证书的过程很快。成功之后,可以看到输出路径,大致就是名为 www.example.com-key.pem , www.example.com.pem 的两个文件

C. 申请完证书后,就可以开始修改nginx配置了,在这一步主要是捕获解析到本地 127.0.0.1 的服务并赚到80和443端口,并支持https服务

  1. 安装nginx(如果没有nginx,需要先安装nginx,有的话就跳过此步骤)

    brew install nginx
    

    启动nginx

    brew services start nginx
    

    打开你的浏览器并访问 http://localhost:8080。 Nginx的欢迎页面应该会出现,这表明Nginx已经成功安装并运行。

  2. 修改nginx配置

    sudo vi /usr/local/etc/nginx/nginx.conf
    

    将这行代码加进去

    server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;
    server_name example.com;
    
    ## 替换为上一步你的证书路径
    ssl_certificate /Users/example.pem;
    ssl_certificate_key /Users/example-key.pem;
    
    location / {
        ## 如果是本地打包后的静态文件的话,用下面这行
        # root /Users/build;
        ## 一般来说,都是是本地的服务,debug比较方便。在这里填上端口号,比如react,默认就是 localhost:3000,如果是vue,就是8080,看你跑的服务了
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    }
    

    修改为自己本地的配置后,输入 :wq 保存并退出。

重启nginx

brew services restart nginx

至此,整个的流程终于完了,打开浏览器输入 https://example.com, 或者 http://example.com 就可以访问本地的服务了