在地址栏中输入网址
解析域名
遍历本地的
hosts
文件,找到待访问域名所对应的ip地址;(这是一个hosts文件)
如果hosts文件中找不到,会委托
dns
服务器进行解析。(192.168.17.1是当前局域网中的dns地址)
拿到ip后,和服务器建立TCP链接。
发送http请求。
接受http响应报文,渲染页面。
解决方案
只要把www.d.com
解析到我们自己的ip上即可。结合域名的解析过程,有两个方案。
A
修改本地hosts文件,把www.d.com
解析到127.0.0.1
。但是考虑到iphone的封闭性,此方案可行性不高。
B
在局域网中搭建dns,让dns负责把www.d.com
解析到127.0.0.1
,然后修改iphone的dns地址或者修改整个局域网环境下的dns地址。
采用方案B实施。
配置dns,将目标域名解析到自己的ip
安装并配置内网dns服务器
- 安装
dnsmasq
dnsmasq是一个轻量级的dns服务。mac可以使用以下命令安装。
1 |
|
homebrew
的安装就不说了。
配置
/usr/local/etc/dnsmasq.conf
使用
vim
打开此文件。uncommentstrict-order
。将listen-address
的值修改为mac的内网ip。1
2
3
4strict-order
# 127.0.0.1可以不写
# 192.168.20.113替换为mac的内网ip
listen-address=127.0.0.1,192.168.20.113
修改
etc/hosts
将
192.168.20.113 www.d.com
添加至最后一行,注意把ip替换成mac的内网ip。这么做的目的是告诉dnsmasq将www.d.com
解析到这台mac的ip。启动dnsmasq
1
2# 一定要加sudo,虽然不加也能启动,但是不work
sudo brew services start dnsmasq
修改iphone的dns
至此,我们的iphone在访问www.d.com
时已经能够跳到mac ip
了。
如果对http
和https
有了解的话,http://www.d.com
访问的是80端口,相当于http://{ip}:80
;而https
对应的是443端口。
而我们的web服务(e.g. tomcat、apache、nodejs)一定不会绑定80和443端口,所以我们需要再做一个反向代理,将80和443端口的请求转发到真正的web服务。
另外,在做反向代理时,需要同时配置ssl证书,这样我们才能通过https
访问。
使用Nginx配置反向代理和ssl
Nginx是一个性能极高的Http
服务器,一般用做静态服务器、反向代理及负载均衡服务器。
申请并下载ssl证书
阿里云提供了简单易用的ssl认证服务,具体步骤就不展开了。我们只需下载适用Nginx的证书就行了。
下载解压后有两个文件,
*.key
|*.pem
。
安装并配置Nginx
mac使用以下命令安装。
1
2
3
4
5
6# install
brew install nginx
# start, stop, restart
nginx
nginx -s stop
nginx -s restart接着我们要修改配置文件,让Nginx将请求转发到我们自己的web服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46vim /usr/local/etc/nginx/nginx.conf
# 如果用户通过http访问,将请求重定向到https。
server {
listen 80;
server_name ecp2020-flatland.powerstationofart.com;
return 301 https://$server_name$request_uri;
}
server {
# 只有通过https://www.d.com 才可以访问
listen 443;
server_name www.d.com;
# 开启ssl认证
ssl on;
# pem或者crt文件路径
ssl_certificate /etc/nginx/cert/www.d.com.crt;
# key文件路径
ssl_certificate_key /etc/nginx/cert/www.d.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
# 反向代理
# 将 `https://www.d.com/` 代理到 `http://127.0.0.1:3000`
location / {
proxy_redirect off;
rewrite ^/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 下面一个location可以不写,这里只是为了举例
# 将 `https://www.d.com/server` 代理到 `http://127.0.0.1:8082`
location /server {
proxy_redirect off;
rewrite /server/(.*) /$1 break;
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}最后启动nginx就可以了。