Nginx反向代理后页面链接重写失效,sub_filter未生效
Nginx反向代理sub_filter不生效问题排查与修复
你的sub_filter未生效,核心原因是后端返回了gzip压缩的响应内容,Nginx默认不对压缩内容执行文本替换。结合你的场景,调整配置如下:
关键修复项
- 让后端返回未压缩的明文内容,确保sub_filter能解析处理
- 修正Host头配置,符合反向代理的正常逻辑
- 补充覆盖更多链接格式的替换规则
修改后的完整配置
server { listen 443 ssl; server_name 192.168.110.136; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; location ~*/plss/(?<subdomain>[^/]+)/(?<path>.*)$ { resolver 8.8.8.8; # 将Host设置为后端域名,避免后端生成异常链接 proxy_set_header Host $subdomain.domain2.com; # 禁用压缩请求,强制后端返回明文 proxy_set_header Accept-Encoding ''; # 显式开启缓冲(默认已开启,显式声明更可靠) proxy_buffering on; sub_filter_once off; sub_filter_types *; # 匹配双引号包裹的绝对路径 sub_filter '="/' '="https://192.168.110.136/plss/$subdomain/'; # 额外匹配单引号包裹的绝对路径(覆盖更多场景) sub_filter '=\'/' '=\'https://192.168.110.136/plss/$subdomain/'; proxy_pass https://$subdomain.domain2.com/$path; } }
进阶优化(如需保留压缩)
如果不想放弃gzip压缩效率,可以让Nginx自动解压后端响应、完成替换后再重新压缩返回:
# 在server或location块内添加 gunzip on; proxy_set_header Accept-Encoding gzip;
补充场景适配
如果页面中存在不带引号的绝对路径(如href=/xxx),需补充对应的替换规则:
sub_filter 'href=/' 'href=https://192.168.110.136/plss/$subdomain/'; sub_filter 'src=/' 'src=https://192.168.110.136/plss/$subdomain/';
内容的提问来源于stack exchange,提问作者Bechara Rizk
相关产品推荐
相关产品推荐

