解决.htaccess移除PHP扩展名仅根目录生效,子目录不生效问题
解决所有目录下PHP扩展名移除的.htaccess配置方案
原规则仅对根目录的index和contact页面生效,若要让所有目录(包括/blog/这类子目录)都能实现PHP扩展名移除,需要取消特定页面的限制,同时适配多级目录结构。
修改后的完整规则
RewriteEngine On # 禁止直接访问.htaccess文件,提升安全性 RewriteRule ^\.htaccess$ - [F] # 内部重写:将无扩展名请求映射到对应.php文件(支持所有目录) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] # 外部跳转:将带.php的URL重定向到无扩展名版本(SEO友好) RewriteCond %{THE_REQUEST} \s/(.+?)\.php[\s?] [NC] RewriteRule ^(.+?)\.php$ /$1 [L,R=301]
规则说明
- 禁止访问.htaccess:避免配置文件被直接查看,增强站点安全性。
- 内部重写规则:先判断请求路径不是目录,且对应的
.php文件确实存在,再将无扩展名的请求内部映射到实际的.php文件,支持任意层级的子目录。 - 外部跳转规则:当用户直接访问带
.php扩展名的URL时,通过301永久重定向跳转到无扩展名版本,避免重复内容影响SEO。
额外提示
- 确保服务器已开启
mod_rewrite模块,否则规则无法生效。 - 测试前建议清空浏览器缓存,因为301重定向会被浏览器缓存,可能导致旧规则残留。
- 若需对特定目录/页面例外处理,可在规则前添加排除条件,比如:
# 排除/admin/目录下的文件不应用扩展名移除规则 RewriteCond %{REQUEST_URI} !^/admin/
内容的提问来源于stack exchange,提问作者Eric Tum
相关产品推荐
相关产品推荐

