在nginx中proxy_pass根据path路径转发时的/问题怎么处理

这篇文章将为大家详细讲解有关在nginx中proxy_pass根据path路径转发时的"/"问题怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

比如下面设置:

location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; proxy_pass ; }

如上面的配置,如果请求的url是会被代理成

而如果这么配置

location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; proxy_pass ; }

则请求的url是会被代理到

当然,可以用如下的rewrite来实现/的功能

location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; rewrite /wangshibo/(.+)$ /$1 break; proxy_pass ; }

列举下面一例

1)第一种配置

[root@BJLX_16_202_V vhosts]# cat ssl-wangshibo.conf upstream at {   server 192.168.1.202:8080 max_fails=3 fail_timeout=30s; }    server {   listen 443;   server_name ;   ssl on;      ### SSL log files ###   access_log logs/wangshibo_access.log;   error_log logs/wangshibo_error.log;    ### SSL cert files ###   ssl_certificate ssl/wang.cer;     ssl_certificate_key ssl/wang.key;      location /attendance/ {   proxy_pass ;                             //不需要加上"/"             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;   proxy_set_header Host $host;   proxy_set_header X-Real-IP $remote_addr;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   proxy_set_header X-Forwarded-Proto https;   proxy_redirect off;     }    }

访问https://www.wangshibo.com/attendance/和:8080/attendance结果是一致的。

2)第二种配置

[root@BJLX_16_202_V vhosts]# cat ssl-wangshibo.conf upstream at {   server 192.168.1.202:8080 max_fails=3 fail_timeout=30s; }    server {   listen 443;   server_name ;   ssl on;      ### SSL log files ###   access_log logs/wangshibo_access.log;   error_log logs/wangshibo_error.log;    ### SSL cert files ###   ssl_certificate ssl/wang.cer;     ssl_certificate_key ssl/wang.key;      location / {   proxy_pass ;                         //一定要加上"/"               proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;   proxy_set_header Host $host;   proxy_set_header X-Real-IP $remote_addr;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   proxy_set_header X-Forwarded-Proto https;   proxy_redirect off;     }   }

访问https://www.wangshibo.com和:8080/attendance结果是一致的。

如下配置,想要实现的需求:

192.168.1.27是后端的real server,8080端口是公司的ehr人事系统端口。

又由于该系统涉及到微信接口访问,即和

由于是内部系统,安全考虑,所以要求:

1)登录ehr人事系统的时候要求使用内网登录,即:8080,访问前要先登录公司VPN
2)登录微信接口和使用外网登录,即使用解析后域名登录。
3)访问,强制跳转为https://ehr.wang.com/attendance

[root@BJLX_4_21_P vhosts]# cat ehr.conf server {   listen 80;   server_name ehr.wang.com;      access_log logs/ehr_access.log;   error_log  logs/ehr_error.log;     return   301 https://$server_name$request_uri;    }   [root@BJLX_4_21_P vhosts]# cat ssl-ehr.conf upstream ehr {   server 192.168.1.27:8080 max_fails=3 fail_timeout=30s; }   server {   listen 443;   server_name ehr.wang.com;   ssl on;     ### SSL log files ###   access_log logs/ehr_access.log;   error_log logs/ehr_error.log;   ### SSL cert files ###   ssl_certificate ssl/wang.cer;      ssl_certificate_key ssl/wang.key;    #ssl_session_timeout 5m;     location / {     return 301 https://ehr.wang.com/attendance;   }     location /attendance/ {   proxy_pass ;   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;   proxy_set_header Host $host;   proxy_set_header X-Real-IP $remote_addr;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #  proxy_set_header X-Forwarded-Proto https;   #proxy_set_header X-Forwarded-Proto https;   proxy_redirect off;   }     location /app/ {   proxy_pass ;   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;   proxy_set_header Host $host;   proxy_set_header X-Real-IP $remote_addr;   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #  proxy_set_header X-Forwarded-Proto https;   #proxy_set_header X-Forwarded-Proto https;   proxy_redirect off;   }  }

注意:

由于从浏览器访问(http)到源站的real server之间要经过Nginx反向代理层(https)

需要将proxy_set_header X-Forwarded-Proto https;这一行注释掉,否则上面的配置无效。

如果中间没有代理层,直接是在real server本机进行nginx的反向代理(即本机nginx反代到本机的8080端口),则这个参数无效注释(已经过验证)

HTTP头域(proxy_set_header)列表与解释

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。