mod_rewrite配置问题:子域名PHP转HTML跳转路径重复致404
解决子域名路径重复的.htaccess规则修改方案
核心问题分析
子域名test1.example.com的DocumentRoot指向/test1,但根目录的.htaccess规则在重定向时错误地将物理路径前缀/test1拼接到URL中,导致地址栏出现重复的test1路径段,最终触发404错误。
修改后的完整根目录.htaccess规则
# 启用mod_rewrite模块 RewriteEngine On # 根据当前域名动态适配RewriteBase,确保URL路径正确映射 RewriteCond %{HTTP_HOST} ^(www|test1|test2)\.example\.com$ [NC] RewriteRule ^ - [E=REWRITE_BASE:/] # 1. 将PHP请求重定向到对应.html地址(地址栏显示.html后缀) # 仅对实际存在的PHP文件生效,避免无效重定向 RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_URI} ^(.*)\.php$ [NC] RewriteRule ^ %1.html [R=301,L,NE] # 2. 将HTML请求内部解析为对应PHP文件(地址栏保持.html不变) # 仅当对应的PHP文件实际存在时才转发,避免404错误 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^(.*)\.html$ [NC] RewriteCond %{DOCUMENT_ROOT}%1.php -f RewriteRule ^ %1.php [L]
关键修改点说明
- 动态适配路径映射:通过匹配所有关联域名,统一设置
RewriteBase为/,利用各域名已配置的DocumentRoot映射,确保URL中的根路径/直接对应到正确的物理目录,避免手动拼接物理路径前缀导致的重复问题。 - 重定向规则优化:使用
%1捕获请求路径中去掉.php后缀的部分,直接拼接.html作为重定向目标,保证URL相对于当前域名的根路径,不会引入多余的test1或test2路径段。 - 添加存在性校验:通过
%{REQUEST_FILENAME} -f和%{DOCUMENT_ROOT}%1.php -f两个条件,确保仅对实际存在的文件执行重定向和内部转发,避免无效请求触发错误。
额外注意事项
- 若
/test1、/test2目录下存在独立的.htaccess文件,请删除或注释其中的重写规则,避免与根目录规则冲突。 - 测试前清空浏览器缓存,301重定向会被浏览器缓存,旧的错误规则可能干扰测试结果。
内容的提问来源于stack exchange,提问作者Se7enDays
相关产品推荐
相关产品推荐

