背景信息:
被代理的服务器(10.90.7.2)上,nginx的配置内容
server { listen 9000; server_name localhost; default_type text/html; location /path1 { root html; index index.html; } location /path1/path2 { root html; index index.html; } }
待访问的页面路径信息如下:
[root@localhost html]# pwd /usr/local/nginx/html [root@localhost html]# cd path1/ [root@localhost path1]# tree . |-- index.html `-- path2 `-- index.html 1 directory, 2 files
单独访问10.90.7.2这个服务器的path1以及path2的效果如下图:
1.在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面不带/,location 对应的url后面也不带/
upstream backend_slash { server 10.90.7.2:9000; } server { listen 9000; server_name localhost; default_type text/html; location /path1 { proxy_pass http://backend_slash; proxy_set_header Host $host:$server_port; proxy_set_header Remote_Addr $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
访问10.90.7.10:9000/path1的path1,效果如图:
2.在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面不带/,location 对应的url后面带/
upstream backend_slash { server 10.90.7.2:9000; } server { listen 9000; server_name localhost; default_type text/html; location /path1/ { proxy_pass http://backend_slash; proxy_set_header Host $host:$server_port; proxy_set_header Remote_Addr $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
访问10.90.7.10:9000/path1的path1,效果如下图,其实和步骤1中的效果一样.
3. 在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面带/,location 对应的url中加入虚拟路径前缀path,后面不带/
upstream backend_slash { server 10.90.7.2:9000; } server { listen 9000; server_name localhost; default_type text/html; location /path { proxy_pass http://backend_slash/; proxy_set_header Host $host:$server_port; proxy_set_header Remote_Addr $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
访问10.90.7.10:9000/path/path1的path1,效果如下图,效果和步骤1,2的一样。
当访问10.130.7.10:9000/path1/path2时,效果如下图:
被代理的服务器10.90.7.2上nginx的error日志内容:
2018/01/11 14:41:43 [error] 20333#0: *52 "/usr/local/nginx/html/1/path2/index.html" is not found (20: Not a directory), client: 10.90.7.10, server: localhost, request: "GET /1/path2/ HTTP/1.0", host: "10.90.7.10:9000"
4. 在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面不带/,location 对应的url中加入虚拟路径前缀path,后面也不带/
upstream backend_slash { server 10.90.7.2:9000; } server { listen 9000; server_name localhost; default_type text/html; location /path { proxy_pass http://backend_slash; proxy_set_header Host $host:$server_port; proxy_set_header Remote_Addr $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
访问10.90.7.10:9000/path/path1的path1,效果如下图:
5. 在前端代理服务器10.90.7.10的nginx.conf中proxy_pass后面带/,location 对应的url中加入虚拟路径前缀path,后面也带/
upstream backend_slash { server 10.90.7.2:9000; } server { listen 9000; server_name localhost; default_type text/html; location /path/ { proxy_pass http://backend_slash/; proxy_set_header Host $host:$server_port; proxy_set_header Remote_Addr $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
访问10.90.7.10:9000/path/path1的path1,效果如图
访问10.90.7.10:9000/path1/path2的path2,效果如下图:
这里要说明一下的,我这里10.90.7.10这个服务器的server (端口9000),是没有配置location / {root html; index index.html;}这么一个规则的,但是依然可以访问到这个服务器下html下面的path1/path2.
为什么呢? 这里要注意下,nginx默认都会有一个 location / {root html; index index.html;}的规则.
访问10.90.7.10:9000/path/path1/path2的path2,效果如图:
综上总结:
1. proxy_pass 后面的url中带上反斜线,和不带反斜线效果差异很大,带反斜线时会将location里面指定的url前缀去掉。
2. location后面的url前缀部分后缀带不带反斜线,效果差异截然不同。
3. nginx的虚拟服务器server的配置中,没有配置默认的location / {}时,默认会有一个location / {root html; index index.html;}