Nginx反向代理后端重定向URL丢失前缀问题求助
问题分析
- 请求
https://example.com/myapp时,Nginx因location /myapp/的匹配规则,会先301重定向到https://example.com/myapp/,再转发为http://192.168.0.100/给后端Apache。 - Apache处理根路径请求后,返回
http://example.com/login的重定向,但Nginx未自动改写该重定向的协议(HTTP→HTTPS)和路径前缀(添加/myapp),导致最终返回给客户端的是https://example.com/login,缺失前缀。
修正后的配置
server { listen 443 ssl; server_name example.com; # 处理不带斜杠的/myapp请求,统一转向带斜杠的路径,避免匹配歧义 location = /myapp { return 301 $scheme://$host/myapp/; } location /myapp/ { proxy_pass http://192.168.0.100/; # 传递客户端请求的Host头,让Apache生成正确域名的重定向 proxy_set_header Host $host; # 告诉Apache请求是通过HTTPS发起的 proxy_set_header X-Forwarded-Proto $scheme; # 改写Apache返回的重定向:将http://example.com/开头的地址替换为https://example.com/myapp/ proxy_redirect http://$host/ https://$host/myapp/; # 传递客户端真实IP给Apache(可选) proxy_set_header X-Forwarded-For $remote_addr; } }
关键配置说明
location = /myapp:精确匹配不带斜杠的请求,强制重定向到带斜杠的版本,确保后续location /myapp/能正确匹配并转发。proxy_set_header Host $host:让Apache知道客户端请求的域名是example.com,而非后端的192.168.0.100,这样Apache返回的重定向会使用example.com作为域名,方便Nginx后续改写。proxy_set_header X-Forwarded-Proto $scheme:告知Apache当前请求是通过HTTPS协议发起的,部分应用会根据这个头自动生成HTTPS重定向(若你的应用支持,可减少proxy_redirect的依赖)。proxy_redirect http://$host/ https://$host/myapp/:核心规则,将Apache返回的http://example.com/xxx格式的重定向,替换为https://example.com/myapp/xxx,既修正了协议,又补上了路径前缀。
内容的提问来源于stack exchange,提问作者Meisterzunge
相关产品推荐
相关产品推荐

