.htaccess配置导致所有链接加载index.php 如何实现SEO友好URL?
问题根因
- 规则执行顺序错误:内部重写至
index.php的规则放在最顶部,优先级远高于后续的后缀移除、index.php移除规则,导致所有非文件/目录的请求直接被拦截交给首页处理,不会匹配对应php文件 - 缺失无扩展名URL到.php文件的内部映射规则:仅配置了
.php后缀的外部重定向,没有把用户访问的/xyz这类无后缀路径内部重写到xyz.php的逻辑 - 重定向规则优先级低于内部重写规则,永远不会生效
修复后的.htaccess配置
RewriteEngine On # 1. 移除URL中的index.php 外部重定向 RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index\.php [NC] RewriteRule ^ %1 [R=301,L] # 2. 移除.php后缀 外部重定向 RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=301,L,NC] # 3. 无后缀路径内部映射到对应.php文件 RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] # 4. 剩余非文件/目录的请求才交给index.php处理(纯多页PHP站点可删除本条及下面两条规则) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L,QSA]
配置说明
- 所有外部重定向规则放在最前面,优先处理用户的可见URL跳转,保证SEO友好
- 新增的.php映射规则会先校验对应路径的.php文件是否存在,存在就先内部加载对应文件,不会走到index.php
- 最后保留的index.php重写规则仅处理不存在对应php文件的路径,适合需要前端路由的单页应用场景
- 测试时建议先把301改成302临时重定向,避免浏览器缓存旧的301规则导致调试异常
内容的提问来源于stack exchange,提问作者Nishant Chaudhary
相关产品推荐
相关产品推荐

