如何将带有查询字符串的 URL 重定向到另一个主机?

如何将带有查询字符串的 URL 重定向到另一个主机?

此 htaccess 代码片段旨在重定向

myhost.com/?p=1&preview=true

alt.myhost.com/?p=1&preview=true

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^myhost.com$ [NC]
RewriteRule ^/\?p=([0-9]+)&preview=true$ http://alt.myhost.com/?p=$1&preview=true [NC,R=301,L]

但出于某种原因,我无法转义 URL 中的 / 和 ? 部分。不确定为什么这不起作用...

我试过逃跑?

\\? \? [?]

我尝试过逃避 /

\\/ \/ [/]

这些似乎都不起作用......

帮助!

答案1

这会将所有请求从 myhost.com 重定向到 alt.myhost.com

RewriteCond %{HTTP_HOST} !^alt\.myhost\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*) http://alt.myhost.com/$1 [L,R,NE]

代码取自官方mod_rewrite 手册

如果无论出于什么原因查询字符串没有被保留,将最后一行替换为

RewriteRule ^/?(.*) http://alt.myhost.com/$1 [L,R,NE,QSA]

更新:这会将您的特定 URL 重定向到另一个域:

RewriteCond %{HTTP_HOST} =myhost.com [NC]
RewriteCond %{QUERY_STRING} ^(p=1&preview=true)
RewriteRule ^$ http://alt.myhost.com/?%1 [R=301,L]

答案2

由于查询字符串“p=([0-9]+)&preview=true”,我猜您需要重定向是因为在子域上拥有 wordpress 管理员并且在主域上拥有网站。

因此您无法预览草稿。

我想出了一个更广泛的解决方案,它也可以适用于自定义帖子类型和添加参数的插件:

RewriteCond %{HTTP_HOST} =myhost.com [NC]
RewriteCond %{QUERY_STRING} (preview=true)
RewriteRule ^$ http://alt.myhost.com/?%{QUERY_STRING} [R=301,L]

用简单的英语来说,当在查询中发现“preview=true”时,重定向会发生到 alt 子域并且保留完整的查询。

相关内容