使用RewriteCond变量配置.htaccess重定向避免循环问题
搞定通配符子域名重写的循环问题
嘿,我来帮你解决这个.htaccess重写的循环坑!首先得揪出问题根源:你现在的规则大概率是没做「防重复触发」的限制,或者不小心用了外部重定向(R=3xx),导致重写后的请求又被同一条规则匹配,陷入死循环。
先给你直接上修正后的可用规则,再拆解细节:
RewriteEngine On # 匹配static.开头的子域名,捕获后面的完整域名部分(比如example.com或test.example.com) RewriteCond %{HTTP_HOST} ^static\.(.*)$ [NC] # 核心防循环条件:如果请求路径已经是 /捕获到的域名/xxx 格式,就跳过这条规则 RewriteCond %{REQUEST_URI} !^/%1/ # 内部重写路径,把捕获到的域名拼到路径最前面 RewriteRule ^(.*)$ /%1/$1 [L]
关键调整说明:
- 加了防循环的判断条件:
RewriteCond %{REQUEST_URI} !^/%1/是重中之重!当第一次重写后,请求的内部路径会变成/example.com/js/test.js,这时候这条条件会检测到路径已经以/example.com/开头,就不会再触发重写,彻底打断循环。 - 转义了域名里的点:
^static\.(.*)$里的.必须转义,不然它会匹配任意字符,而不是咱们要的域名分隔点,之前的规则可能因为这个导致匹配范围太宽,间接引发问题。 - 用内部重写而非外部重定向:如果你之前加了
R=301之类的标记,那就是让浏览器跳转到新地址,这时候浏览器还是会带着static.xxx.com的Host发起请求,自然会再次触发规则循环。咱们要的是服务器内部悄悄重写路径,所以只需要[L]标记(表示这条规则是最后一条,执行完就停)。
测试效果:
- 访问
static.example.com/js/test.js,服务器内部会把路径改成/example.com/js/test.js,浏览器地址栏完全不变,也不会循环。 - 访问
static.test.example.com/css/test.css,会被重写成/test.example.com/css/test.css,完美符合你的需求。
如果你其实想要外部重定向(让用户地址栏显示新路径),那得调整成下面这样,但要确保重定向后的域名能正常访问:
RewriteEngine On RewriteCond %{HTTP_HOST} ^static\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/%1/$1 [R=301,L]
不过看你的需求描述,应该是要内部重写,所以第一种方案才是正确的选择。
内容的提问来源于stack exchange,提问作者AotN
相关产品推荐
相关产品推荐

