Nginx服务
对非同源地址的nginx配置要求
http同端口访问http跳转https(497错误)
关于Nginx 的 location 匹配规则总结
Nginx+LUA+Redis实现token访问鉴权
Nginx实现后端Server域名动态解析
Nginx反向代理跨域问题
浏览器报错ERR_CONTENT_LENGTH_MISMATCH
Nginx常见HTTP Code错误排查
使用acme.sh部署证书至Nginx
Nginx在普通用户下使用特权端口 (443端口)
Nginx配置自定义状态页
try_files和alias的组合使用
Nginx中301重定向导致端口丢失
本文档使用 MrDoc 发布
-
+
home page
Nginx中301重定向导致端口丢失
>访问Nginx服务的非标端口地址时,链接通过301跳转到标准端口的问题 ------------ 因为种种原因,nginx并不能监听在80端口,或者外部通过NAT方式将请求丢给nginx,外部地址并不是标准http(s)端口,此时nginx并不能智能的处理重定向,发生重定向时会丢失端口 # 现象 浏览器访问 `http://localhost:90/web_test` 地址通过301重定向`http://localhost/web_test/` **在重定向时,在访问的目标资源后添加了`/`,并且没有带端口访问,导致服务访问失败** Curl访问: ```bash [root@java conf]# curl -I 'http://localhost:90/web_test' HTTP/1.1 302 Server: Wegine Pro Date: Tue, 28 Feb 2023 05:35:22 GMT Connection: keep-alive Location: http://localhost/web_test/ ``` # 分析 比如以下两种配置方案: **【配置示例1】** ```nginx #反向代理 listen 81; set $TOMCAT_HOME /var/lib/tomcat7; location / { root $TOMCAT_HOME/webapps/ROOT; 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; } ``` ------------ **【配置示例2】** ```nginx # 访问/data的时候,浏览器发出请求`http://xxx.com:81/data` # 未查询到/data文件,url被重定向到`http://xxx.com/data/`目录 listen 81; location /data { root /var/data; } ``` 浏览器请求时候发现访问是目标资源存在,但没有携带`/`,则会在链接后添加`/`后进行301重定向,发生重定向时,端口号就会丢失,导致浏览器访问到错误的端口。 # 解决 分别对这两种情况给出解决方案。 **【配置示例1】** 该配置中采用反向代理模式,则可直接在配置中添加如下参数 ``` proxy_set_header Host $http_host; ``` 对于这个配置项的官方释义是: ``` An unchanged “Host” request header field can be passed like this: ``` >注意: 网络流传的文章里会采用`$host`,而不是`$http_host`,注意甄别配置,测试当配置为`$host`时没有任何效果 ------------ 在默认安装nginx包的情况下,程序会包含官方配置文件`/etc/nginx/proxy_params`,内容如下: ```nginx proxy_set_header Host $http_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 $scheme; ``` 也可直接引用上述配置文件实现 ```nginx location / { root $TOMCAT_HOME/webapps/ROOT; proxy_pass http://127.0.0.1:8080/; include proxy_params; } ``` ------------ **【配置示例2】** 该配置是直接访问目标资源,没有通过后端程序实现访问,同事访问的目录没有携带`/` 比如在 `$document_root`目录下存在`data/index.html`文件 但是访问的时候使用的是`http://localhost:81/data`(尾部没加`/`表示访问一个目录) 服务器此时会进行 **301 Moved Permanently 永久重定向** 处理, 如上所示,如果Nginx监听的是非标准端口,301返回的 Location 不会携带端口号,导致浏览器请求出错。 用curl显示访问: ```bash $ curl -v localhost:81/data * Hostname was NOT found in DNS cache * Trying *.*.*.*... * Connected to localhost (*.*.*.*) port 81 (#0) > GET /data HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:81 > Accept: */* > < HTTP/1.1 301 Moved Permanently * Server nginx is not blacklisted < Server: nginx < Date: Wed, 18 Nov 2015 07:39:03 GMT < Content-Type: text/html < Content-Length: 178 < Connection: keep-alive < Location: http://localhost/data/ < <html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx</center> </body> </html> * Connection #0 to host localhost left intact ``` 结果显示 Location 没有携带端口号。 **解决方案:** ```nginx if (-d $request_filename) { rewrite [^/]$ $scheme://$http_host$uri/ permanent; } ``` 通过配置对URL重写的形式带上端口号,问题即可解决。
Nathan
Feb. 28, 2023, 2:17 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password