能否在新站点Apache服务器的.htaccess中针对旧站点301重定向的流量设置规则?
能否在新站点Apache服务器的.htaccess中针对旧站点301重定向的流量设置规则?
嘿,这个需求是完全可以实现的,但你当前的规则踩了一个关键的坑——依赖%{HTTP_REFERER}来判断请求来源,这玩意儿真的不靠谱!
为什么你的现有规则失效?
当旧站点通过301重定向把用户引导到新站点时,浏览器发送给新站点的请求里,HTTP_REFERER不一定会携带旧域名:
- 很多现代浏览器在跨域重定向时会自动隐藏referer,或者用户的浏览器设置里禁用了referer发送;
- 如果旧站点和新站点的协议不一致(比如一个HTTP一个HTTPS),referer也会被浏览器直接丢弃。
所以靠%{HTTP_REFERER}来识别旧站点的流量,大概率会漏掉大部分请求,这就是你的规则没生效的核心原因。
正确的实现思路
要可靠地识别来自旧站点的流量,你需要让旧站点的301重定向主动传递来源标识,或者直接根据请求本身携带的原始信息来处理:
方案1:修改旧站点的重定向规则(推荐)
如果能修改旧站点的.htaccess,在301跳转时额外添加一个自定义参数(比如from_old_site=1),这样新站点就能准确识别这些请求。举个例子:
旧站点的规则可以写成:
# 旧站点的.htaccess规则,跳转时携带来源标识和原查询参数 RewriteCond %{QUERY_STRING} ^thequerystring=([0-9]*) RewriteRule ^(.*)$ https://www.newdomain.org/$1?from_old_site=1&%{QUERY_STRING} [R=301,L]
然后新站点的规则就可以基于这个参数来处理:
# 新站点的.htaccess规则 RewriteCond %{QUERY_STRING} (^|&)from_old_site=1(&|$) RewriteCond %{QUERY_STRING} ^.*thequerystring=([0-9]*).*$ RewriteRule ^(.*)$ https://www.newdomain.org/redirect.php?theimage=%1 [R=301,L,QSD]
这里的QSD标记(你的Apache 2.4.57版本刚好支持)会丢弃原查询参数,避免参数堆积。
方案2:如果无法修改旧站点,退而求其次的办法
如果没法改旧站点的规则,那只能退一步——假设旧站点的301是把旧域名的完整URL(包括查询参数)直接跳转到新站点的对应路径,那新站点可以直接根据请求的QUERY_STRING来处理,不用管来源:
RewriteCond %{QUERY_STRING} ^thequerystring=([0-9]*) RewriteRule ^(.*)$ https://www.newdomain.org/redirect.php?theimage=%1 [R=301,L,QSD]
当然,这样的话所有带有这个查询参数的请求(不管是不是来自旧站点)都会被跳转,如果你能接受这个范围,这也是可行的。
额外注意事项
- 确保你的Apache启用了
mod_rewrite模块; - 测试规则时,记得清空浏览器缓存(因为301重定向会被浏览器强缓存);
- 你的Apache版本2.4.57支持
QSD等新标记,不用担心兼容性问题。
备注:内容来源于stack exchange,提问作者deeholzman
相关产品推荐
相关产品推荐

