如何让.htaccess优先访问同名PHP文件而非文件夹?
解决方法
问题根源在于Apache默认的DirectorySlash机制:当请求的路径对应一个真实存在的文件夹时,Apache会自动跳转到带斜杠的文件夹路径,这个行为会优先于你的Rewrite规则执行,导致同名PHP文件被忽略。
你需要做两步调整来实现优先访问同名PHP文件:
- 禁用自动添加文件夹斜杠的跳转
在Options +FollowSymLinks -MultiViews这一行下方添加:
DirectorySlash Off
- 给PHP匹配规则增加排除文件夹的条件
修改原有的“允许无后缀PHP访问”规则,确保仅当请求路径不是文件夹时,才尝试匹配同名PHP文件:
# 优先访问同名PHP文件,忽略文件夹 RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+)$ $1.php [L]
修改后的完整.htaccess配置如下:
# BEGIN - Allow Sucuri Services <IfModule mod_rewrite.c> RewriteRule ^sucuri-(.*)\.php$ - [L] </IfModule> # END - Allow Sucuri Services <Files 403.shtml> order allow,deny allow from all </Files> # 禁用MultiViews和自动文件夹斜杠跳转 Options +FollowSymLinks -MultiViews DirectorySlash Off RewriteEngine on # 重定向HTTP到HTTPS RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 重定向非www到www RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L] # 优先访问同名PHP文件,忽略文件夹 RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+)$ $1.php [L] # 前端控制器规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ci_index.php?/$1 [L]
补充说明
DirectorySlash Off直接阻止Apache自动跳转带斜杠的文件夹路径,让你的Rewrite规则有机会优先匹配PHP文件。- 新增的
RewriteCond %{REQUEST_FILENAME} !-d是双重保险,确保只有当请求路径不是文件夹时,才触发PHP文件的匹配规则。
内容的提问来源于stack exchange,提问作者GurusGuru
相关产品推荐
相关产品推荐

