.htaccess RewriteCond含环境变量正则匹配:带WWW URL末尾斜杠重定向失效
问题解决:www域名下的末尾斜杠重定向失效
核心问题分析
你的规则有两个关键问题导致www.domain.com/page/无法触发重定向:
- 路径范围限定错误:原规则中的
RewriteCond %{REQUEST_URI} /public/(.+)/$仅对/public/前缀的路径生效,你的测试URL/page/不在这个范围内,自然不会触发规则(你说domain.com/page/能生效,大概率是实际测试的是/public/page/,或者规则中的这个条件是多余的)。 - 主机名匹配逻辑不严谨:原表达式
%{HTTP_HOST} -strmatch '(www\\.)?%{ENV:DOMAIN}'是子串匹配而非精确匹配,虽然能匹配到www.domain.com,但结合前面的路径条件,依然无法触发规则。
修正后的.htaccess代码
RewriteEngine On RewriteBase / # 仅在生产环境生效:DOMAIN建议通过Apache服务器配置(SetEnv指令)设置,避免硬编码 RewriteCond %{ENV:DOMAIN} !="" [NC] # 精确匹配带www或不带www的目标域名 RewriteCond %{HTTP_HOST} ^(www\.)?%{ENV:DOMAIN}$ [NC] # 匹配末尾带斜杠的非根目录路径 RewriteCond %{REQUEST_URI} ^(.+)/$ # 排除实际存在的物理目录(目录默认带斜杠,无需重定向) RewriteCond %{REQUEST_FILENAME} !-d # 一次性完成:移除www、移除末尾斜杠、强制HTTPS RewriteRule ^ https://%{ENV:DOMAIN}%1 [R=301,L]
关键修正说明
- 移除路径前缀限制:删掉了原规则中
/public/的限定,现在所有非根目录的末尾斜杠路径都会被处理。 - 精确主机名匹配:用
^www\.%{ENV:DOMAIN}$和^%{ENV:DOMAIN}$的合并匹配,确保仅处理目标域名的请求,避免影响其他域名。 - 环境变量校验:增加
%{ENV:DOMAIN} !=""条件,确保只有在生产环境设置了DOMAIN变量时规则才生效,适配多环境切换。 - 简化重定向逻辑:直接用
%1捕获无斜杠的路径部分,拼接成最终的HTTPS地址,避免路径拼接错误。
额外建议
不要在.htaccess里硬编码DOMAIN,建议在生产环境的Apache配置文件中通过SetEnv DOMAIN domain.com设置环境变量,这样无需修改.htaccess即可适配不同环境。
内容的提问来源于stack exchange,提问作者Cyril
相关产品推荐
相关产品推荐

