proxy_redirect
proxy_passURL结尾没有 / ,可能需要proxy_redirect
·
1、作用:
1、用来修改 被代理服务器(真实服务器) 返回的响应头中的 location 头域(location标识着客户端访问的地址) 和 refresh头域。
2、利用proxy_redirect这个指令可以为被代理服务器发出的相对重定向增加主机名。
2、语法:
proxy_redirect redirect(旧地址) replacement(新地址);proxy_redirect default; #默认设置proxy_redirect off; #关闭重定向
2.1、替换的例子 一:
假设
被代理 服务器返回 Location字段为: http://localhost:8000/two/some/uri/
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将Location字段重写为http://frontend/one/some/uri/
2.2、替换的例子 二:
在代替的新的字段中可以不写服务器名,
这样就使用服务器的基本名称和端口,即使它来自非80端口。
proxy_redirect http://$host:8080/
/ ;
# 把客户端访问端口跳转回默认端口,这里可能是80
通常需要这么做的机会很少。
3、容易用到的场景:
假设请求链接是 http://www.test.com/aming
结果会被301重定向到请求的链接为 http://www.test.com:8080/aming/
3.1、场景前提
但实现这种“容易失误”的重定向有
几个前提 才会发生:
1、需要 locatin 是 / 而不是匹配更复杂;proxy_pass 不能加uri,且最后不能 / 结尾
(
注:如果proxy_pass 最后加 / 的话,是不会发生这种情况的,所以还是习惯加 / 的好 )
2、访问的uri必须是真实存在的目录,比如这里的 aming 目录是必须存在的
3、访问的URL不能以 / 结尾 。只能是 http://www.test.com/aming 而不能是 http://www.test.com/aming/
3.2、实例对比实验
例:
#假如代理服务器
还没加 proxy_redirect
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
真实的有 /data/wwwroot/test.com/aming 目录,目录下有 index.html文件,文件内写着如下
curl -x192.168.133.140:80 www.test.com/aming/
结尾有 / 访问到 /data/wwwroot/test.com/aming/index.html ,正常
curl -x192.168.133.140:80 www.test.com/aming
结尾不带 / 访问到 www.test.com
:8080/aming/ ,发生错误
因为客户访问到的代理服务器,没开8080端口,客户端这样访问会导致访问失败。
在代理上记录日志
在后端服务器记录日志
日志 添加上 端口记录字段
curl -x192.168.133.140:80 www.test.com/aming/ 时,都是正确的
代理服务器日志显示被访问的是80端口
被代理服务器显示被访问的是8080端口
curl -x192.168.133.140:80 www.test.com/aming
不带 / 时,会产生301重定向问题
这里可以看到客户端请求的响应头 Location 显示的是 8080 端口,证明客户端的请求被改为访问8080端口了
代理服务器日志显示被访问的是80端口,重定向了一次被访问端口变成了8080。
这可是记录的客户端的访问,客户端访问8080在代理服务器上是没有对应的监听的,因此会发生了301重定向错误。
被代理服务器显示访问的是8080端口,也重定向了一次
所以这里需要加上 proxy_redirect ,把8080重定向回来80。
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://127.0.0.1:8080;
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_redirect http://$host:8080/ /;
# 把客户端的请求跳转回80
}
}
客户端访问成功,代理服务器 Location 响应头显示:客户的请求不再重定向到8080端口。
4、部分特性:
redirect 跳转页面,是服务端返回新的 url 地址,
浏览器二次发出 url 请求
,
属于一次
全新
的 http 请求,无法携带上一次请求的参数。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)