这篇文章将为大家详细讲解有关在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)列表与解释
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。