如何实现轮流重定向?TURNO_ACTUAL无法随重定向递增的问题
解决Apache Rewrite轮流重定向的计数持久化问题
你遇到的核心问题是:Rewrite环境变量仅在当前请求生命周期内有效,请求结束后就会被销毁,所以没法跨请求保存TURNO_ACTUAL的递增状态。要实现轮流重定向,必须用Cookie来持久化计数,因为Cookie会被浏览器保存并在每次请求时发送给服务器。
以下是完整的实现规则,基于Apache 2.4+(支持mod_expr算术运算):
# 1. 初始化Cookie:如果没有TURNO_ACTUAL Cookie,设置为1 RewriteCond %{HTTP_COOKIE} !TURNO_ACTUAL= RewriteRule ^ - [CO=TURNO_ACTUAL:1:your-domain.com:86400:/,E=TURNO_ACTUAL:1] # 2. 读取已有Cookie的计数到环境变量 RewriteCond %{HTTP_COOKIE} TURNO_ACTUAL=([0-9]+) RewriteRule ^ - [E=TURNO_CURRENT:%1] # 3. 计算下一个计数并更新Cookie # 当前计数为3时,重置为1 RewriteCond %{ENV:TURNO_CURRENT} =3 RewriteRule ^ - [E=TURNO_NEXT:1,CO=TURNO_ACTUAL:1:your-domain.com:86400:/] # 当前计数小于3时,递增1 RewriteCond %{ENV:TURNO_CURRENT} <3 RewriteRule ^ - [E=TURNO_NEXT:%{expr:%{ENV:TURNO_CURRENT}+1},CO=TURNO_ACTUAL:%{expr:%{ENV:TURNO_CURRENT}+1}:your-domain.com:86400:/] # 4. 根据计数执行轮流重定向 RewriteCond %{ENV:TURNO_NEXT} =1 RewriteRule ^ /target-url-1 [R=302,L] RewriteCond %{ENV:TURNO_NEXT} =2 RewriteRule ^ /target-url-2 [R=302,L] RewriteCond %{ENV:TURNO_NEXT} =3 RewriteRule ^ /target-url-3 [R=302,L]
关键说明:
- 替换
your-domain.com为你的实际域名,Cookie有效期86400(单位秒,可按需调整) - 如果站点用HTTPS,在Cookie参数后加
:secure,比如CO=TURNO_ACTUAL:1:your-domain.com:86400:/:secure,避免Cookie在非HTTPS请求中发送 - 重定向状态码
302是临时重定向,若需永久重定向可改为301,但轮流场景建议用302 - 确保Apache已启用
mod_rewrite和mod_expr模块(2.4版本以上默认已包含,可通过apache2ctl -M查看)
内容的提问来源于stack exchange,提问作者toxic_admin
相关产品推荐
相关产品推荐

