LiteSpeed/Apache重写规则实现镜像站隐藏双域名子文件夹咨询
你之前的规则失效核心原因有两个:
- 规则优先级逻辑错误:第一条重写规则已经把所有不存在的路径都映射到了
/domain.com/下,后续的www.domain.com规则永远不会被触发 - 缺少了「暴露子目录路径的URL重定向清理」逻辑,没有把用户/页面链接里带
/www.domain.com/前缀的路径先重定向为干净路径
完整解决方案
以下是适配你需求的完整.htaccess规则:
RewriteEngine On # 第一部分:清理暴露子目录的URL,301重定向为干净路径 # 处理带/www.domain.com/前缀的请求 RewriteRule ^www\.domain\.com/(.*)$ /$1 [L,R=301,NC] # 处理带/domain.com/前缀的请求(避免首页外的domain路径暴露) RewriteRule ^domain\.com/(.*)$ /$1 [L,R=301,NC] # 第二部分:内部路径映射 # 首页特殊处理:映射到domain.com的index.html RewriteRule ^(/)?$ /domain.com/index.html [L] # 其他路径优先匹配www.domain.com下的资源 RewriteCond %{REQUEST_URI} !^/(domain\.com|www\.domain\.com)/ RewriteCond %{DOCUMENT_ROOT}/www.domain.com/$1 -f [OR] RewriteCond %{DOCUMENT_ROOT}/www.domain.com/$1 -d RewriteRule ^(.*)$ /www.domain.com/$1 [L] # www.domain.com下不存在的资源再 fallback 到domain.com下 RewriteCond %{REQUEST_URI} !^/(domain\.com|www\.domain\.com)/ RewriteCond %{DOCUMENT_ROOT}/domain.com/$1 -f [OR] RewriteCond %{DOCUMENT_ROOT}/domain.com/$1 -d RewriteRule ^(.*)$ /domain.com/$1 [L]
规则逻辑说明
- 第一部分的重定向规则:只要访问路径开头是
www.domain.com/或者domain.com/,都会自动301重定向到去掉前缀的路径,完全符合你要求的URL全程不显示子文件夹的需求,不管是用户手动输入还是页面链接带了前缀,都会自动清理 - 首页规则:单独处理根路径请求,直接映射到domain.com目录下的首页,和你之前的实现逻辑一致
- 非首页路径优先匹配www子目录:因为原站除了首页外所有内容都在www.domain.com下,所以优先去这个目录查找对应资源,存在就直接返回,不会暴露路径
- 最后加fallback规则:如果www子目录找不到对应资源,再去domain.com目录查找,避免漏掉零散的非首页资源
测试注意事项
测试前先清理浏览器缓存,之前的301重定向可能会被缓存影响测试结果。
内容的提问来源于stack exchange,提问作者rafamerino
相关产品推荐
相关产品推荐

