htaccess配置:多域名同主机下重定向请求到对应子文件夹
.htaccess多域名路由规则修正方案
核心问题是原有规则未对请求目标做真实资源校验,导致所有请求无论是否对应静态文件,都被强制转发到入口文件。以下是可直接使用的修正后配置:
RewriteEngine on RewriteBase / # domain1.com 路由规则:指向www目录入口页 RewriteCond %{HTTP_HOST} ^domain1\.com$ [NC] RewriteRule ^(.*)$ www/index.html [L,QSA] # domain2.com 静态资源放行规则 RewriteCond %{HTTP_HOST} ^domain2\.com$ [NC] # 校验请求路径是否对应app目录下真实存在的文件、目录或软链接 RewriteCond %{DOCUMENT_ROOT}/app/%{REQUEST_URI} -f [OR] RewriteCond %{DOCUMENT_ROOT}/app/%{REQUEST_URI} -d [OR] RewriteCond %{DOCUMENT_ROOT}/app/%{REQUEST_URI} -l RewriteRule ^(.*)$ app/$1 [L,QSA] # domain2.com 动态请求转发规则 RewriteCond %{HTTP_HOST} ^domain2\.com$ [NC] RewriteRule ^(.*)$ app/index.php?/$1 [L]
规则说明
- 修正了原有HTTP_HOST匹配的正则漏洞:将未转义的
.替换为\.,避免.作为正则通配符误匹配domain2acom、domain2xcom这类非目标域名。 - 静态资源优先匹配:对domain2的请求优先校验app目录下是否存在对应物理资源,存在则直接返回资源,不触发PHP解析,覆盖图片、样式表、JS脚本、静态页面等所有真实存在的文件访问需求。
- 动态请求兜底转发:不存在对应物理资源的请求,统一转发到app目录下的index.php单入口处理,路径参数会按原有规则正常传递。
注意事项
该配置需放置在站点根目录(与
www、app文件夹同级)下生效,请提前确认Apache站点配置中已设置AllowOverride All,否则.htaccess规则不会被加载解析。
效果验证
- 访问
domain2.com/some/request/1/2:app目录下无对应物理路径,自动转发到app/index.php处理 - 访问
domain2.com/test.png:检测到app/test.png真实存在,直接返回图片资源 - 访问
domain2.com/static/css/main.css:检测到对应静态文件真实存在,直接返回样式表资源
内容的提问来源于stack exchange,提问作者Mateusz Nejman
相关产品推荐
相关产品推荐

