.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
相关产品推荐
相关产品推荐

