You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:54:36