Nginx中处理重定向端口丢失问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx中处理重定向端口丢失问题相关的知识,希望对你有一定的参考价值。
参考技术A nginx有时候并不像apache那样智能,对于redirect location的处理尤为惨淡,几乎只能用户手工处理非标准端口的问题。比如因为种种原因,nginx并不能监听在80端口,或者外部通过NAT方式将请求丢给nginx,外部地址并不是标准http(s)端口,此时nginx并不能美好的处理这些重定向。发生重定向的时候会丢失端口。
比如以下两种参考范例:
浏览器请求的时候会发现只要发生重定向,端口号就会丢失,导致浏览器访问到错误的端口。
分别对这两种情况给出解决方案。
这个很容易搞定,那一堆 proxy_set_header 不知道何时在网上流传开来的,几乎国内外文档无一例外都是这个鸟样子。后来我发现 gitlab-ce 这个用非标准端口访问是没有问题的,我看了一下gitlab-ce的nginx配置,发现是这么配置的:
我又发现nginx软件包释放出的配置文件,发现里面其实是带有一个参考文件 /etc/nginx/proxy_params
这里面写的也是 proxy_set_header Host $http_host; ,于是乎直接include,搞定
没这个文件就把这些内容手工敲到 location 配置段下。
再细看官方文档,其实也提及了:
这个比较棘手,比如 $document_root 存在 data/index.html 文件,但是访问的时候使用的是 /data 最后没加 / 去表示其访问的是一个目录,服务器此时会进行 301 Moved Permanently 永久重定向处理,但是比较扯的地方在于,如果nginx监听的是非标准端口,这个301返回的 Location 没有端口号,导致浏览器请求出错。
用curl可以很明显的看到这一点:
可以很明显的看到 Location 没有端口号了,这个重定向又和反向代理不一样。于是遍寻google,最终在stackoverflow的问答中找到了解决方案:
通过配置对URL重写的形式带上端口号,问题解决。
以上是关于Nginx中处理重定向端口丢失问题的主要内容,如果未能解决你的问题,请参考以下文章
通过地址重写, 解决ingress在使用非标准端口(80, 443)时, 引起的重定向丢失端口问题