如果在 Nginx 正向代理中,链接跳转后带上了上级服务器的端口号导致访问失败,可能有几个原因需要检查:
一、确保上级服务器监听的端口号是正确的: 确保在 proxy_pass 中使用的上级服务器的地址和端口号是正确的。检查上级服务器是否正在监听所配置的端口。
location / { proxy_pass http://upstream_server: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; }
请将 upstream_server 替换为实际的上级服务器主机名或 IP 地址,确保端口号正确。
二、检查上级服务器是否正确处理请求: 确保上级服务器能够正确处理来自 Nginx 的代理请求。查看上级服务器的日志和状态,以确保没有错误。
三、考虑使用 proxy_redirect 进行重定向调整: 如果上级服务器返回的内容包含了端口号,并且你希望在跳转时将其去除,可以考虑使用 proxy_redirect 进行调整。
location / { proxy_pass http://upstream_server:8080; proxy_redirect http://upstream_server:8080/ http://yourdomain.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
这样可以将上级服务器返回的重定向地址中的端口号去除。
四、查看 Nginx 错误日志: 检查 Nginx 的错误日志,通常位于 /var/log/nginx/error.log(具体路径可能会有所不同),以获取有关错误的更多信息。
检查这些方面,看看是否有任何错误或配置问题。根据实际情况可能需要进行适当的调整。
注意:代理服务器上级数据服务器代码抓到的端口号处理方式
如果是反向代理的上级程序进行了端口数据传送,单纯的通过上述修改是不能解决问题的,例如tp程序,通过查询服务日志是因为程序抓取到端口导致数据无法正确交互出现了301错误:
192.168.87.6 - - [05/Jan/2024:22:08:45 +0800] "GET / HTTP/1.1" 200 258 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" 192.168.87.6 - - [05/Jan/2024:22:08:45 +0800] "GET /web HTTP/1.1" 301 162 "http://ai.80x.co/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
知道问题就好解决了
首先需要在代理nginx上添加301重定向
# 捕获后端服务返回的 301/302 重定向头,并进行修改 proxy_intercept_errors on; error_page 301 302 = @handle_redirect;
然后对响应代码进行重新定义
location @handle_redirect { # 获取后端服务返回的重定向地址 set $redirect_location $upstream_http_location; # 替换重定向地址中的端口号为代理服务器的域名 if ($redirect_location ~* ^http://[^/]+:\d+(.*)$) { set $redirect_location_modified http://ai.80x.co$1; } # 发起修改后的重定向请求 rewrite ^ $redirect_location_modified permanent;
完整代码
location ^~ / { proxy_pass http://ip:93; 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 REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_http_version 1.1; # proxy_hide_header Upgrade; add_header X-Cache $upstream_cache_status; #Set Nginx Cache set $static_fileyrjbwia2 0; if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) { set $static_fileyrjbwia2 1; expires 1m; } if ( $static_fileyrjbwia2 = 0 ) { add_header Cache-Control no-cache; } # 捕获后端服务返回的 301/302 重定向头,并进行修改 proxy_intercept_errors on; error_page 301 302 = @handle_redirect; } location @handle_redirect { # 获取后端服务返回的重定向地址 set $redirect_location $upstream_http_location; # 替换重定向地址中的端口号为代理服务器的域名 if ($redirect_location ~* ^http://[^/]+:\d+(.*)$) { set $redirect_location_modified http://ai.80x.co$1; } # 发起修改后的重定向请求 rewrite ^ $redirect_location_modified permanent; } #PROXY-END/
简化后部分代码
# 处理所有进入的请求 location / { # 开启代理错误拦截,使Nginx能够处理后端服务器的错误页面 proxy_intercept_errors on; # 定义301和302重定向的处理规则,将重定向请求转发到@handle_redirect location error_page 301 302 = @handle_redirect; }
# 处理301和302重定向的请求 location @handle_redirect { # 获取后端服务返回的重定向地址 set $redirect_location $upstream_http_location; # 使用 $scheme 替换重定向地址中的协议部分为当前请求的协议 if ($redirect_location ~* ^http://[^/]+:(\d+)(.*)$) { set $redirect_location_modified $scheme://$host$2; } # 发起修改后的重定向请求 rewrite ^ $redirect_location_modified permanent; }