通过Nginx反向代理隐藏路径后缀 实现mail.example.com访问/mail目录
Nginx反向代理去除路径前缀配置方案
现有配置问题分析
- 路径重复拼接:当邮件应用返回的静态资源、跳转链接自带
/mail前缀时,用户浏览器请求mail.example.com/mail/xxx,现有配置会把请求代理到https://1.2.3.4/mail/mail/xxx,导致资源404。 - 未修正后端响应的路径:后端返回的重定向头、HTML内容里的绝对路径都携带
/mail前缀,浏览器会按照这个路径发起请求,自然加载失败。
可用配置参考
server { listen 443 ssl http2; server_name mail.example.com; # 你的SSL证书配置 # ssl_certificate /path/to/your/fullchain.pem; # ssl_certificate_key /path/to/your/privkey.pem; location / { # 末尾加斜杠,Nginx自动完成路径映射,无需手动拼接$request_uri proxy_pass https://1.2.3.4/mail/; proxy_http_version 1.1; 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 X-Forwarded-Proto $scheme; # 禁用压缩保证内容替换生效 proxy_set_header Accept-Encoding ""; # 修正后端返回的重定向路径 proxy_redirect https://1.2.3.4/mail/ /; proxy_redirect /mail/ /; # 替换响应内容里的路径前缀 sub_filter 'href="/mail/' 'href="/'; sub_filter 'src="/mail/' 'src="/'; sub_filter 'action="/mail/' 'action="/'; sub_filter_once off; sub_filter_types text/html text/css application/javascript; } # 直接访问带/mail前缀的路径时,自动重定向到去掉前缀的地址 location ^~ /mail/ { rewrite ^/mail(.*)$ $1 permanent; } }
配置说明
proxy_pass末尾添加斜杠:Nginx会自动完成路径映射,用户请求/test.css会被代理到https://1.2.3.4/mail/test.css,避免手动拼接$request_uri导致的重复前缀问题。proxy_redirect配置:自动修正后端返回的301/302跳转响应头,把带/mail前缀的跳转地址改为根路径地址。sub_filter配置:自动替换HTML、CSS、JS内容中的绝对路径前缀,把所有/mail/开头的资源路径替换为/,解决静态资源加载失败问题;添加proxy_set_header Accept-Encoding "";禁用压缩,保证替换逻辑生效。/mail/路径重定向规则:用户访问带/mail前缀的地址时,会自动永久重定向到去掉前缀的地址,避免路径重复问题。
内容的提问来源于stack exchange,提问作者Fabiansc
相关产品推荐
相关产品推荐

