回退 - 使用 apache vhost 配置重定向到新域
Posted
技术标签:
【中文标题】回退 - 使用 apache vhost 配置重定向到新域【英文标题】:Fallback - redirect to a new domain using apache vhost configuration 【发布时间】:2018-05-12 22:30:11 【问题描述】:这是https://***.com/posts/47547418的后续问题
我想要来自
的请求somedomain.com/loadproduct?product=dell-inspiron-15
被选择性地重定向到
someotherdomain.com/dell-inspiron-15
但同时我想确保如果新域出现问题,用户仍然可以通过在 url 中添加 /old 来使用旧域。
例如,如果用户使用
somedomain.com/old/loadproduct?product=dell-inspiron-15
那么它们不应被重定向到 someotherdomain,而应通过有效的 url somedomain.com/loadproduct?product=dell-inspiron-15 提供服务
但如果他们使用
somedomain.com/loadproduct?product=dell-inspiron-15
它们应该被重定向。
目前我的虚拟主机配置如下所示。它为选定的产品重定向到其他域,但没有后备配置。
Listen 12567
NameVirtualHost *:12567
<VirtualHost *:12567>
ServerName somedomain.com
ProxyPreserveHost On
RewriteEngine On
RewriteCond %QUERY_STRING (?:^|&)product=(Dell-Inspiron-15) [NC,OR]
RewriteCond %QUERY_STRING (?:^|&)product=(Dell-Inspiron-16) [NC,OR]
RewriteCond %QUERY_STRING (?:^|&)product=(Dell-Inspiron-17) [NC]
RewriteRule ^/?loadproduct$ http://someotherdomain.com/%1? [R=301,L,NC]
</VirtualHost>
非常感谢这里的任何线索。
【问题讨论】:
【参考方案1】:修改您的 RewriteCond 条件并在路径 (URI) 中表示不接受 /old/ 的位置添加一个。所以:
RewriteEngine On
RewriteCond %REQUEST_URI !^.*/old/.*$ [NC]
RewriteCond %QUERY_STRING (?:^|&)product=(Dell-Inspiron-15) [NC,OR]
RewriteCond %QUERY_STRING (?:^|&)product=(Dell-Inspiron-16) [NC,OR]
RewriteCond %QUERY_STRING (?:^|&)product=(Dell-Inspiron-17) [NC]
RewriteRule ^/?loadproduct$ http://someotherdomain.com/%1? [R=301,L,NC]
在第一行,不需要指定 [AND],因为它是隐含的。 !
字符否定匹配。
免责声明:我没有在真正的 Apache 上测试过这个,但我很确定它没问题。
【讨论】:
但是 /old 不是一个有效的 url,它应该重定向到一个没有 /old 的 url 在你的问题中你说如果/old/
存在,不要重定向。所以我添加的行是确保 RewriteRule 不应用于包含/old/
的请求。我误解了这个问题还是?
我试着改变一下问题语言,你现在可以检查一下吗?
其实我的意思是在 url 中使用 old 作为后备标记。
我添加了 RewriteCond %QUERY_STRING (?:^|&)product=(ENGY) [NC,OR] 所以正如预期的那样 "?loadproduct=ENGY" => 应该被重定向,但我可以看到带有“?loadproduct=ENGYHyd”的网址也被重定向。知道为什么吗?是在做前缀匹配吗?以上是关于回退 - 使用 apache vhost 配置重定向到新域的主要内容,如果未能解决你的问题,请参考以下文章