Nginx反向代理配置:移除用户可见URL路径中的squirrelmail/部分
Nginx反向代理配置:移除用户可见URL路径中的squirrelmail/部分
我完全懂你的需求——就是想让用户访问https://mail.domain.tld时,后台自动代理到内部服务的squirrelmail路径,但用户全程都看不到URL里出现squirrelmail/这串,包括点击应用内的标签、打开邮件这些后续操作,也不能让这个路径冒出来对吧?
你之前遇到的问题其实很典型:只靠rewrite处理进来的请求根本不够,因为SquirrelMail这类老应用会在返回的页面里硬编码自己的路径,用户点击页面里的链接时,应用会自动把squirrelmail/加上,导致URL里又出现这个串。
给你调整后的完整配置,直接替换你原来的location /部分就行:
server { listen 443 ssl; server_name mail.domain.tld; # 这里替换成你的SSL证书实际路径 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { # 核心配置:把用户的根请求代理到内部服务的squirrelmail路径,结尾的斜杠一定要加! proxy_pass https://internal.domain.tld:8081/squirrelmail/; # 下面的请求头配置保留你原来的即可,确保内部服务能正确识别请求来源 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; # 关键操作:替换应用返回内容里的路径,彻底解决后续跳转带squirrelmail的问题 sub_filter 'squirrelmail/' '/'; # 确保所有匹配的内容都被替换,不止第一个 sub_filter_once off; # 指定要处理的内容类型,避免误改二进制文件 sub_filter_types text/html text/css text/javascript application/javascript; } }
我给你拆解下配置里的关键点:
- 删掉原来的rewrite规则:你原来的
rewrite /squirrelmail/(.*) /$1 last完全没必要,因为用户本来就不会请求带squirrelmail/的URL,留着反而可能干扰正常的路径映射。 - proxy_pass结尾的斜杠:这个斜杠是核心,它会自动把用户请求的
/xxx映射到内部服务的/squirrelmail/xxx,比如用户点https://mail.domain.tld/inbox,实际代理到https://internal.domain.tld:8081/squirrelmail/inbox。 - sub_filter替换响应内容:这才是解决后续跳转带路径的根本——SquirrelMail会在页面的链接、脚本引用里硬写
squirrelmail/,用sub_filter把这些字符串全部替换成/,用户点击的链接就都是根路径的了,自然不会在URL里看到squirrelmail/。
如果你的内部服务还会返回带完整域名的绝对路径(比如https://internal.domain.tld:8081/squirrelmail/),那再额外加一条sub_filter就行:
sub_filter 'https://internal.domain.tld:8081/squirrelmail/' 'https://$host/';
把它加到刚才的sub_filter列表里,就能把内部域名的链接替换成用户访问的公网域名了。
最后提醒下:要确保你的Nginx安装了ngx_http_sub_module模块,一般官方预编译的包默认都带,如果是自己编译的Nginx,要记得加上--with-http_sub_module参数重新编译。
备注:内容来源于stack exchange,提问作者fazelukario
相关产品推荐
相关产品推荐

