htaccess中index.html跳转login.html的Redirect规则不生效如何解决
规则不生效原因
- 模块执行优先级问题:
Redirect是mod_alias模块的指令,而你用到的RewriteEngine系列规则属于mod_rewrite模块。Apache的执行逻辑是优先跑完所有mod_rewrite规则,再执行mod_alias的规则,哪怕你把Redirect写在Rewrite规则的后面也不会改变执行顺序,前面的加.html后缀规则已经处理完请求后,Redirect自然不会生效。 - 规则顺序不合理:即使同属mod_rewrite规则,也是从上到下依次匹配,你把重定向逻辑放在路径重写规则之后,请求已经被重写规则处理,不会走到重定向逻辑。
- 根路径访问适配问题:用户直接访问域名根路径
/时,Apache会通过DirectoryIndex内部映射到index.html,这种内部子请求无法被Redirect指令匹配。
解决方案
推荐直接改用mod_rewrite实现重定向,把重定向规则放在所有重写规则的最前面,修改后的完整.htaccess内容如下:
RewriteEngine On RewriteBase / # 重定向规则放在最前面,L标记表示匹配后不再执行后续重写规则,R=301为永久重定向 RewriteRule ^index\.html$ /login.html [L,R=301] # 原来的加.html后缀规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^(.*)$ $1.html [L] ErrorDocument 404 /404.html ErrorDocument 403 /403.html Options -Indexes
修改完成后需要清空浏览器缓存再测试,避免之前的301重定向缓存影响验证结果。
内容的提问来源于stack exchange,提问作者QI10
相关产品推荐
相关产品推荐

