nginx强制301重定向的诡异问题
问题
打开设计平台官网:
http://baigong.xxx.cn/Products/designPlatform
刷新这个链接,就自动重定向到如下路径:
http://baigong.xxx.cn:9000/Products/designPlatform/
而公网的域名服务器9000是没有开放的,也是就说baigong.xxx.cn:9000是无法打开的。
预期目标
http://baigong.xxx.cn/Products/designPlatform
刷新这个链接,就自动重定向到如下路径:
http://baigong.xxx.cn/Products/designPlatform/
分析
nginx有个自带的特性,这个特性之前一直没注意到,那就是遇到目录就自动重定向到新的路径,这个新的路径uri是一样的,但多了斜杠。
例如上面的链接的 /Products/designPlatform 其实是个目录。
正常情况下nginx就会重定向,也就是在原有路径的情况再增加一个斜杠。
由于经过多层转发,导致端口发生了变化。而在底层转发时,$host是没有发生变化的。但是端口转发了,从80变成了9000
http://baigong.xxx.cn/Products/designPlatform
所以这个链接就自动变成了如下链接。
http://baigong.xxx.cn:9000/Products/designPlatform/
解决
这个时候要么rewrite链接,要么开启不进行端口变化的配置,幸好nginx就有个配置项:
port_in_redirect
这个配置项默认是on,也就是开启的。
按照当前的预期目标,这里应该是要让端口不变,也就是使用第一层访问的端口80,所以这个配置项必须禁用。
事实上,禁用了这个配置项,问题解决。
完整的配置如下:
server {
listen 9000;
server_name baigong.xxx.cn;
port_in_redirect off;
#charset koi8-r;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html/website;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
-------------------------
技术不在于多么高超先进巧妙,而在于要有现实价值!!!
技术不在于多么高超先进巧妙,而在于要有现实价值!!!