如何在admin或其他目录下通过.htaccess隐藏.php扩展名
解决.htaccess隐藏.php扩展名覆盖子目录(如/admin)的问题
我来帮你搞定这个问题!你的现有规则已经实现了根目录的.php隐藏,但子目录没生效的原因主要是匹配范围和文件检查逻辑的小问题,咱们调整一下就能让所有目录(包括/admin这类子目录)都生效。
先分析现有规则的局限
你原来的隐藏扩展名规则是:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
这里的^([^\.]+)$只匹配没有点号的单级路径,比如根目录的index没问题,但admin/login这种带斜杠的子目录路径,或者路径里带点的请求(比如admin/user.profile)就匹配不到了,这就是子目录不生效的核心原因。
修改后的完整.htaccess规则
直接替换你现有的规则,就能覆盖所有目录:
RewriteEngine On RewriteBase / # Force HTTPS(保持原规则不变) RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 重定向非www到www(排除子域名,保持原规则不变) RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 隐藏所有目录(根目录+子目录)的.php扩展名 # 1. 检查请求的路径不是一个真实存在的文件 RewriteCond %{REQUEST_FILENAME} !-f # 2. 检查对应的.php文件确实存在(避免重写不存在的路径导致无效404) RewriteCond %{REQUEST_FILENAME}.php -f # 3. 匹配所有路径(包括子目录的斜杠),自动添加.php后缀 RewriteRule ^(.*)$ $1.php [NC,L]
关键修改点说明
RewriteBase /:明确以网站根目录为基准,避免子目录下的路径解析混乱,确保重写规则在所有子目录中都能正确工作。^(.*)$替换原匹配规则:.*可以匹配任何字符(包括子目录的斜杠),不管是根目录的index还是admin/dashboard都能被覆盖。- 新增
RewriteCond %{REQUEST_FILENAME}.php -f:这个条件能防止服务器把不存在的请求(比如/admin/non-existent)重写成/admin/non-existent.php,避免不必要的404错误,同时让规则更严谨。
验证与注意事项
- 测试:直接访问
/admin/你的文件名(比如/admin/login),只要对应的/admin/login.php存在,就能正常打开,不需要加.php后缀。 - 子目录的
.htaccess:如果子目录下有自己的.htaccess文件,会覆盖根目录的规则,要么删除子目录的.htaccess,要么在里面添加同样的扩展名隐藏规则。 - 清空缓存:因为之前的301重定向会被浏览器缓存,测试前记得清空浏览器缓存,避免旧缓存影响结果。
内容的提问来源于stack exchange,提问作者user6651317
相关产品推荐
相关产品推荐

