You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.htaccess子域名转同名子目录重定向异常:/blog与/blog/行为不一致

修复子域名重定向中目录尾斜杠不一致问题

当前用以下.htaccess规则实现子域名到同名子目录的映射(比如mooga.example.com对应/mooga/目录):

RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.example\.com$
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule ^(.*)$ /%1/$1 [L,QSA]

但访问不带尾斜杠的目录(如https://mooga.example.com/blog)时,会错误跳转到https://mooga.example.com/mooga/blog/,而带尾斜杠的https://mooga.example.com/blog/能正常访问。

问题原因

Apache的mod_dir模块会自动对“存在的目录但请求不带尾斜杠”发起301重定向,添加尾斜杠。这个内部重定向会再次触发你的Rewrite规则,导致子域名对应的目录名被重复拼接。

解决方案

有两种可行的修复方式:

方式一:优先处理目录尾斜杠重定向

把目录加尾斜杠的规则放在最前面,确保在子域名映射前完成尾斜杠的添加,避免规则二次触发:

# 先给目录自动添加尾斜杠
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

# 子域名到子目录的映射规则
RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.example\.com$
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule ^(.*)$ /%1/$1 [L,QSA]

方式二:修改匹配条件排除二次触发

调整第二个RewriteCond条件,允许请求URI已经是/%1/开头的情况,避免重复映射:

RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.example\.com$
# 排除已映射过的请求,避免二次匹配
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1(/.*)?$
RewriteRule ^(.*)$ /%1/$1 [L,QSA]

效果验证

修改后,访问https://mooga.example.com/blog会先被重定向到https://mooga.example.com/blog/,然后正确映射到服务器的/mooga/blog/目录;直接访问https://mooga.example.com/blog/也能正常加载内容,两种访问方式表现一致。

内容的提问来源于stack exchange,提问作者Jimmy Jhon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:16:07