Apache mod_rewrite子域名映射目录且地址栏不变配置故障排查
问题原因与修复方案
先排查基础配置
首先确认两个前置配置正常,这是子域名规则生效的前提:
- images.example.com的DNS解析已指向你的服务器IP
- Apache虚拟主机配置中,images.example.com的
DocumentRoot和主域名一致,都指向public_html目录,否则你写在public_html下的.htaccess规则根本不会被子域名请求加载
规则逻辑问题修复
你当前的子域名测试规则存在重写死循环:所有请求(包括echo.php本身的请求)都会被匹配重写,触发Apache 500错误,表现为页面无响应。
以下是修复后的完整规则:
RewriteEngine on # 根域名跳转www + 全局HTTP转HTTPS RewriteCond %{HTTP_HOST} ^example\.com [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L] RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L] # 主域名www.example.com内部重写到v2021目录 RewriteCond %{HTTP_HOST} ^www\.example\.com [NC] RewriteCond %{REQUEST_URI} !^/v2021/ RewriteRule ^(.*)$ v2021/$1 [L] # 子域名测试规则:转发到echo.php RewriteCond %{HTTP_HOST} ^(.+?)\.example\.com [NC] # 排除实际存在的文件/目录,避免echo.php自身被重写导致循环 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ echo.php?a=%1&b=$1 [L] # 上线后替换成实际的images子域名规则即可 # RewriteCond %{HTTP_HOST} ^images\.example\.com [NC] # RewriteCond %{REQUEST_URI} !^/images/ # RewriteRule ^(.*)$ images/$1 [L]
关键修改点说明
- 给www的重写规则新增了
RewriteCond %{REQUEST_URI} !^/v2021/条件,避免已经重写到v2021的请求被二次匹配,防止循环 - 给子域名规则新增了文件/目录存在性判断,跳过真实存在的资源请求,彻底解决重写循环问题
- 所有域名匹配规则加了
[NC]标记,不区分大小写匹配,避免域名大小写差异导致规则不触发
测试注意
测试前先清空浏览器缓存,301跳转是永久缓存,旧的错误规则会被缓存导致测试结果不准。如果仍然有异常,可以开启Apache的rewrite日志,查看具体的重写执行流程定位问题。
内容的提问来源于stack exchange,提问作者user1000698
相关产品推荐
相关产品推荐

