基于.htaccess的根目录切换与PHP后缀隐藏兼容问题问询
解决Apache Rewrite的两个核心问题:根目录切换与PHP后缀隐藏
我来帮你搞定这两个困扰你的Apache Rewrite配置问题,咱们结合需求一步步调整规则,解决路径兼容的问题。
核心需求回顾
- 问题1:将站点根目录切换至
/app/,让/www/app/home.php对应访问地址https://xxxx.com/home.php,同时兼容路径结尾带/或不带/的情况 - 问题2:隐藏
.php后缀,让/www/app/home.php可通过https://xxxx.com/home或https://xxxx.com/home/访问
完整的Rewrite配置方案
下面是整合后的.htaccess配置代码,已经兼顾了两个需求的兼容性:
RewriteEngine On # 【可选】单独配置特定页面(比如你提到的food页面),优先匹配更具体的规则 RewriteRule ^food/?$ /app/food.php [L,NC] # 1. 处理目录请求:兼容带/或不带/的路径,重定向到/app下的对应目录 RewriteCond %{REQUEST_URI} !^/app RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.*?)/?$ /app/$1/ [L,NC] # 2. 处理文件请求:隐藏.php后缀,兼容带/或不带/的路径,指向/app下的PHP文件 RewriteCond %{REQUEST_URI} !^/app RewriteCond %{DOCUMENT_ROOT}/app/%{REQUEST_URI}.php -f RewriteRule ^(.*?)/?$ /app/$1.php [L,NC] # 3. 兜底规则:处理其他未匹配的请求,统一指向/app目录 RewriteCond %{REQUEST_URI} !^/app RewriteRule ^(.*)$ /app/$1 [L,NC]
关键规则解释
咱们拆解下每个部分的作用,方便你理解和调整:
RewriteEngine On:开启Apache的URL重写功能,这是所有规则的基础- 特定页面规则:如果需要单独配置某个页面(比如你的food页面),把这个规则放在最前面,
^food/?$中的/?就实现了兼容带/或不带/的路径,[L,NC]表示停止后续规则匹配且不区分大小写 - 目录处理规则:
- 第一个
RewriteCond确保请求不是已经指向/app目录的 - 第二个
RewriteCond检查请求的路径是否是真实存在的目录 ^(.*?)/?$匹配任意带/或不带/的路径,重写到/app/$1/保证目录结尾有斜杠,避免重复内容的SEO问题
- 第一个
- 文件处理规则:
- 第一个
RewriteCond同样排除已指向/app的请求 - 第二个
RewriteCond检查/app目录下是否存在对应的.php文件(比如请求/home时,检查/app/home.php是否存在) - 同样用
^(.*?)/?$兼容带/或不带/的路径,重写到对应的PHP文件
- 第一个
- 兜底规则:如果上面的目录和文件规则都不匹配,就把请求转发到
/app目录下的对应路径,覆盖其他边缘情况
为什么之前的配置不生效?
你之前尝试的规则冲突主要是因为规则顺序不对,而且没有兼顾目录和文件的不同场景:
- 之前先处理了
.php后缀隐藏,再处理根目录切换,导致规则匹配顺序混乱 - 单独的
food规则如果放在后面,可能被前面的通用规则先匹配,所以要优先放具体规则
内容的提问来源于stack exchange,提问作者bb_inger
相关产品推荐
相关产品推荐

