使用.htaccess重定向URL并隐藏PHP扩展名时自动跳转到未知文件夹
解决.htaccess重定向后出现404及跳转异常的问题
你的问题核心在于隐藏PHP扩展名的规则只覆盖了根目录的index请求,子目录下的请求没有被正确映射到对应的.php文件,所以访问/abc/index时服务器找不到对应的资源,返回404错误。我帮你梳理下问题原因和修正方案:
问题分析
你当前配置里的这条规则:
RewriteRule ^index$ index.php [L]
只会精确匹配根目录下的index请求(比如www.yourdomain.com/index),但对于子目录如www.yourdomain.com/abc/index完全不生效——因为^index$是从URL开头开始匹配,子目录的URL前缀是abc/,所以服务器会把/abc/index当成一个实际的文件或目录去查找,找不到就返回404。
修正后的完整.htaccess配置
把规则改成下面这样,就能覆盖所有目录下的无PHP扩展名请求:
Options +FollowSymLinks RewriteEngine On # 非www域名重定向到www(完整保留原有路径) RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] # 仅当请求的不是真实文件、目录或符号链接时,自动添加.php后缀 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ $1.php [L]
关键改动说明
扩展PHP扩展名隐藏的规则范围:
把原来的^index$ index.php改成^(.*)$ $1.php后,任何不存在的文件/目录请求都会自动补上.php后缀。比如:/index→/index.php/abc/index→/abc/index.php/user/profile→/user/profile.php
只要对应的.php文件真实存在,就能正常访问。
保留原有www重定向逻辑:
你的www重定向规则本身是没问题的,它会把所有非www的请求(比如yourdomain.com/abc)完整重定向到www.yourdomain.com/abc,不会丢失路径信息。
额外注意事项
- 确保你的Apache服务器已经开启了
mod_rewrite模块(默认一般是开启的,如果没开需要联系主机商或自行在配置中启用)。 - 测试阶段可以把
R=301改成R=302(临时重定向),避免浏览器缓存错误的重定向规则,确认所有请求正常后再改回301(永久重定向)。 - 如果有特定页面不需要添加
.php后缀(比如静态HTML页面),可以在规则前添加排除条件,比如:# 排除static-page请求,不添加.php后缀 RewriteCond %{REQUEST_URI} !^/static-page$
内容的提问来源于stack exchange,提问作者span
相关产品推荐
相关产品推荐

