.htaccess中redirect 301生效但RewriteRule规则不生效问题求助
失效原因
- 规则顺序错误是核心问题。你将自定义
RewriteRule放在了WordPress默认路由规则的末尾,WordPress自带规则的最后一行RewriteRule . /index.php [L]带有L标识,匹配成功后会直接终止后续所有规则的执行,因此你写在这行之后的重写规则永远不会被触发。 - 存在规则被覆盖的隐患。你把自定义规则写在了
BEGIN WordPress和END WordPress标记块内部,后续WordPress更新固定链接配置时,会自动覆盖该块内的所有手动修改内容,规则会直接丢失。 - 规则内的双引号属于冗余写法,虽然不会直接导致失效,但不符合Apache配置规范,建议移除。
解决方法
- 调整规则位置,将所有自定义重写规则移动到
BEGIN WordPress块之外,且放在WordPress默认规则的前面,修改后的.htaccess参考如下:
# 自定义重写规则(写在BEGIN WordPress块外避免被系统覆盖) <IfModule mod_rewrite.c> RewriteEngine On # 不带查询字符串的重定向规则 RewriteRule ^test/bad-link.*$ http://localhost:8000 [NC,QSD,L,R=301] # 原有正常生效的301跳转也可放在此处 Redirect 301 /bad-link/ http://localhost:8000/ </IfModule> # BEGIN WordPress # Директивы (строки) между `BEGIN WordPress` и `END WordPress` # созданы автоматически и подлежат изменению только через фильтры WordPress. # Сделанные вручную изменения между этими маркерами будут перезаписаны. <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
- 修改配置后清空浏览器缓存再测试,301重定向会被浏览器永久缓存,旧的规则缓存会干扰测试结果。
内容的提问来源于stack exchange,提问作者Мохамед Русланович
相关产品推荐
相关产品推荐

