【问题标题】:Redirect olddomain querystring layout to newdomain and new querystring layout?将旧域查询字符串布局重定向到新域和新查询字符串布局?
【发布时间】:2013-08-01 20:37:29
【问题描述】:

好的,说我的博客网站myurl.org 与一个单独的域的链接一样多:

old.myurl.org?oldvar=foo

只有old.myurl.org 不再存在并被new.myurl.org 取代。

如果new.myurl.org 上的查询字符串变量相同,我相信我可以使用以下方法从.htaccess 重写:

RewirteCond %{http_host} ^old.myurl.org$ [NC]
RewriteRule ^(.*)$ new.myurl.org [L,R=301,QSA]

唯一的问题是我还需要将查询字符串 var 从 oldvar 更改为 newvar 并保留它的数据 (foo)。

有很多关于如何以不同方式重写查询字符串变量的示例,但我似乎找不到这种情况的示例。

我需要重写:

old.myurl.org?oldvar=foo

收件人:

new.myurl.org?newvar=foo

编辑

此外,我有几个潜在的查询字符串键值需要考虑,但并不是所有的都会一直存在。

所以我可能需要:

old.myurl.org?oldvar=foo&oldvar2=bar --> new.myurl.org?newvar=foo&newvar2=bar

old.myurl.org?oldvar2=bar --> new.myurl.org?newvar2=bar

这甚至可能是不可能的,但在一种情况下,我需要去除部分查询字符串值。所以?oldvar=foo{term} 可能需要变成?newvar=foo

再次感谢!

【问题讨论】:

    标签: .htaccess mod-rewrite query-string


    【解决方案1】:

    第一个条件匹配域,第二个条件匹配查询字符串,规则将匹配您的域根:

    RewriteCond %{HTTP_HOST} ^old\.myurl\.org$ [NC]
    RewriteCond %{QUERY_STRING} ^oldvar=(\w+)$
    RewriteRule ^$ http://new.myurl.org/?newvar=%1 [R=301,L]
    

    您也可以放置多个查询字符串:

    RewriteCond %{HTTP_HOST} ^old\.myurl\.org$ [NC]
    RewriteCond %{QUERY_STRING} ^oldvar=(\w+)$ [OR]
    RewriteCond %{QUERY_STRING} ^oldvar=(\w+)&oldvar2=(\w+)$
    RewriteRule ^$ http://new.myurl.org/?newvar=%1&newvar2=%2 [R=301,L]
    
    RewriteCond %{HTTP_HOST} ^old\.myurl\.org$ [NC]
    RewriteCond %{QUERY_STRING} ^oldvar2=(\w+)$
    RewriteRule ^$ http://new.myurl.org/?newvar2=%1 [R=301,L]
    

    要使用x/y/z 之类的路径,正如您在评论中提到的,您更改RewriteRule 例如我们当前使用的规则,只会从yourdomain.com/?... 重定向,即:

    RewriteRule ^$ http://new.myurl.org/?newvar2=%1 [R=301,L]
    

    如果你想赶上不同的路径,你可以这样做:

    RewriteRule ^x/?$ http://new.myurl.org/?newvar2=%1 [R=301,L]
    

    上面会捕获yourdomain.com/x?...yourdomain.com/x/?...

    您也可以有多个路径,并使用这样的 OR 条件:

    RewriteRule ^(x|x/y|x/y/z)/?$ http://new.myurl.org/?newvar2=%1 [R=301,L]
    

    上面的意思是我们要匹配x/?... OR x?... OR x/y?... and x/y/?... OR x/y/z?... OR x/y/z/?...

    通过将其封装在括号中并使用 | 作为分隔符和 OR。

    ^$ 表示从头到尾匹配,所以当它不包含任何内容时意味着不匹配,这意味着根文件夹 domain.com/,当有内容时它将匹配内容,例如 domain.com/x 或其他你放进去。

    【讨论】:

    • 谢谢 Prix,这有帮助。
    • 问题...如果不满足 %{QUERY_STRING} 条件,重写规则是否仍会应用域重写?此外,我必须考虑几个潜在的查询字符串键,但没有一个是保证的。我将用一个例子编辑原始问题...
    • @AaronWaller 不,如果不满足任何条件将不适用,但是您可以提出更多条件。将更新一个例子。
    • 这正是我所需要的。如果它超出了这个问题的范围,我可以开始一个新线程,但如果我可以从 oldvar=foo{term} 中删除 "{term}" 也会很棒
    猜你喜欢
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2011-04-28
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多