Nginx反向代理Radicale时,Thunderbird DAV自动配置的邮箱用户名截断问题
Nginx反向代理Radicale时,Thunderbird DAV自动配置的邮箱用户名截断问题
嘿,我刚好碰到过类似的情况,你踩的坑大概率是map指令的位置不对,或者没正确替换变量——我来给你一步步说清楚怎么搞定:
问题根源
你之前用map没生效,很大可能是把map放在了server或者location块里面了——Nginx的map指令必须定义在http级别(也就是所有server块外面),不然根本不会生效。另外,你需要确保在反向代理时传递的是转换后的变量,而不是原始的$remote_user。
解决方案步骤
在http块中添加map规则
打开你的Nginx主配置(或者专门的include配置文件),在http { ... }块里面加入这段map规则,用来把完整邮箱提取出@前面的本地部分:map $remote_user $radicale_user { # 匹配@符号前的所有字符,提取为$1 ~^([^@]+)@.*$ $1; # 兼容非邮箱格式的用户名,避免出错 default $remote_user; }修改location块中的REMOTE_USER变量
回到你原来的Radicale反向代理location配置,把proxy_set_header REMOTE_USER $remote_user;改成我们刚定义的$radicale_user:location /radicale/ { # The trailing / is important! proxy_pass http://[::1]:5232/; # The / is important! proxy_set_header X-Script-Name /radicale; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; # 这里换成转换后的变量 proxy_set_header REMOTE_USER $radicale_user; proxy_pass_header Authorization; }重启Nginx测试
执行nginx -s reload或者对应的重启命令,然后触发Thunderbird的DAV配置,去Radicale的日志里看HTTP_REMOTE_USER字段,应该就变成邮箱的本地部分了。
额外提醒
- 如果你的Nginx配置有多个server块,这个map规则会全局生效,但
default分支能兼容非邮箱格式的用户名(比如手动配置时输入的纯用户名),不用担心影响其他服务。 - 要是你之前的正则有问题,上面的
~^([^@]+)@.*$是最稳妥的写法:匹配以任意非@字符开头,直到@符号的部分,精准提取本地用户名。
备注:内容来源于stack exchange,提问作者roughnecks
相关产品推荐
相关产品推荐

