如何用.htaccess实现同名文件与文件夹的URL优化及后缀隐藏
解决方案
直接替换你的.htaccess代码为以下内容,就能满足所有需求:
RewriteEngine On DirectorySlash Off # 重定向末尾带斜杠的目录请求到无斜杠版本 RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+)/$ $1 [R=301,L] # 重写请求到对应的.php文件(优先匹配.php文件,而非同名文件夹) RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+)$ $1.php [L]
规则说明
- DirectorySlash Off:关闭Apache默认给目录请求自动添加末尾斜杠的行为,避免系统自动跳转干扰自定义规则。
- 末尾斜杠重定向:当请求路径是真实存在的目录且末尾带斜杠时(比如
example.com/foo/),通过301永久重定向去掉斜杠,跳转到example.com/foo。 - PHP文件重写:
- 先检查请求路径加上
.php后缀后是否为真实存在的文件(比如请求example.com/foo时,检查foo.php是否存在)。 - 如果存在,就将请求内部重写为对应的PHP文件。这条规则同时支持根目录(
/foo→foo.php)和子目录(/foo/bar→foo/bar.php)的情况,且因为优先检查PHP文件的存在性,会自动忽略同名文件夹,解决了文件夹优先级的问题。
- 先检查请求路径加上
原代码失效原因
- 原规则
^([^.]+)$仅匹配根目录下无后缀的请求,无法处理/foo/bar这类子目录路径。 - 未处理同名文件夹的优先级:Apache默认优先访问真实存在的文件夹,原规则没有先检查对应PHP文件是否存在,导致请求
/foo时会进入文件夹而非指向foo.php。
内容的提问来源于stack exchange,提问作者Moataz Ghazy
相关产品推荐
相关产品推荐

