.htaccess规则对autodiscover大小写匹配失效,该如何解决?
问题背景
不同邮件客户端(如新版Outlook和其他客户端)对autodiscover相关URL的大小写处理不一致:新版Outlook请求autodiscover/autodiscover.xml,其他客户端则请求Autodiscover/Autodiscover.xml。为了将所有相关URL重定向到autoconfig-mail.php,编写了如下.htaccess规则:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^[Aa]utodiscover/Autodiscover.xml autoconfig-mail.php [QSA,NC,L] RewriteRule ^mail/config-v1.1.xml autoconfig-mail.php [NC,L]
目前规则对Autodiscover.xml的大小写匹配有效,但URL开头的autodiscover大小写匹配失效,在线测试工具显示规则应有效,调整QSA或其他选项也无效果。
问题原因
规则执行顺序拦截:
前面的文件/目录存在检查规则会优先执行,当请求的路径对应服务器上实际存在的文件、符号链接或目录时,会触发RewriteRule ^.*$ - [NC,L],其中L标志会直接终止后续所有规则的执行,导致后面的autodiscover重写规则根本没机会运行。冗余写法与系统特性冲突:
手动用[Aa]限定开头大小写的同时又添加了NC(忽略大小写)标志,虽然逻辑不冲突,但如果服务器是Linux这类大小写敏感的系统,存在的Autodiscover目录或文件会被直接放行,重写规则自然不会生效。
解决方案
调整规则顺序+简化匹配逻辑
把重写规则移到文件存在检查之前,同时利用NC标志自动忽略所有大小写,无需手动写[Aa]这类限定:
RewriteEngine On # 优先处理autodiscover及mail配置文件的重写 RewriteRule ^autodiscover/autodiscover.xml autoconfig-mail.php [QSA,NC,L] RewriteRule ^mail/config-v1.1.xml autoconfig-mail.php [NC,L] # 仅当文件/目录实际存在时,直接放行请求 RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L]
额外检查
如果服务器是Linux等大小写敏感系统,确认是否存在Autodiscover目录或Autodiscover.xml文件,若存在建议删除,避免这些实际存在的资源被直接访问而绕过重写规则。
内容的提问来源于stack exchange,提问作者Kptainflintt

