在工作中,常常会有这样的需求,更新了一个功能模块,需要在正式环境下测试,主要是在网络请求的同源策略的情况,比如常见的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时时指向本地服务
- 打开终端,输入以下命令以编辑hosts文件:
sudo vi /etc/hosts
- 添加这行到文件中。这行的意思是将example.com域名解析到本地IP地址127.0.0.1。
127.0.0.1 example.com
- 保存并推出。
:wq
- 为了让更改立即生效,可能需要刷新本地DNS缓存。在终端中输入以下命令:至此修改host结束。这时在本地进入 https://example.com, https://example.com 时会转到本地。但是不出意外页面会报错。原因很简单,因为此时等于直接转到了本地的80 和 433端口,这两个端口目前还没有服务嘛
sudo killall -HUP mDNSResponder
B. 接下来,先申请ssl用,443端口要走本地服务需要用到,也就是解析https需要的证书
在这里我们用到的是一个叫 mkcert 的工具,可以看官方文档安装。这里简单写一下步骤
先安装homebrew,homebrew 是 Mac OS平台下的软件包管理工具,同样的,如果已经装过跳过此步
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
用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服务
安装nginx(如果没有nginx,需要先安装nginx,有的话就跳过此步骤)
brew install nginx
启动nginx
brew services start nginx
打开你的浏览器并访问 http://localhost:8080。 Nginx的欢迎页面应该会出现,这表明Nginx已经成功安装并运行。
修改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