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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:06:14