如何从mod_rewrite规则排除URL,阻止其重定向至首页
问题根源分析
你的问题出在两条规则的交互冲突上:
- 虽然HTTPS重定向规则正确排除了
/template/路径,但WordPress的重写规则会捕获所有不存在的文件/目录请求,将其转发到index.php。如果/template/不是服务器上真实存在的物理目录,就会触发这条规则,把http://example.com/template/重写到http://example.com/index.php。 - 随后,WordPress的站点配置(比如后台「站点URL」设置为HTTPS)会自动将HTTP的
index.php请求重定向到HTTPS版本,也就是https://example.com/index.php。最后,WordPress的路由系统会把index.php请求规范化为首页路径,于是就出现了两次301跳转的情况。
解决方案
我们需要修改.htaccess,让/template/路径既跳过HTTPS重定向,也绕过WordPress的重写规则,直接放行。具体调整如下:
1. 优化HTTPS重定向规则(可选,让规则更简洁)
原规则里的RewriteCond %{REQUEST_URI} !^/template/.*$ [NC]可以简化为!^/template/(.*$是多余的,^/template/已经能匹配所有以/template/开头的路径),不过这不是核心问题。
2. 在WordPress规则前添加排除规则
在# BEGIN WordPress注释之前,新增一条规则,让/template/及其子路径不进入WordPress的重写流程:
# 放行/template/路径,不经过WordPress重写 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^template/ - [L] </IfModule>
最终完整的.htaccess配置
# force https <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} !^/template/ [NC] RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,QSA] </IfModule> # 放行/template/路径,不经过WordPress重写 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^template/ - [L] </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
额外注意事项
- 如果
/template/是真实存在的物理目录,确保目录下有index.php或服务器默认的索引文件,否则可能返回403禁止访问。 - 测试前请清空浏览器缓存,因为301重定向会被浏览器持久缓存,可能导致测试结果不准确。
- 检查WordPress后台「设置→常规」里的站点URL配置,确保不需要强制
/template/路径走HTTPS(你的规则已经排除了该路径,所以主要还是.htaccess的规则优先级问题)。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

