301通过htaccess将旧参数名称重定向到新参数名称

时间:2015-12-31 14:54:29

标签: apache .htaccess mod-rewrite redirect url-redirection

我刚刚更改了两个参数名称,并希望将旧名称重定向到更改名称,并在URL中的任何位置使用任何值。 e.g:

product.php?colornew=anyvalue&productname=anyvalue

301重定向到:

product.php?color=anyvalue&product=anyvalue

请注意,这只是一个示例,正如我所说,这两个参数可以在任何值的URL中的任何位置。

3 个答案:

答案 0 :(得分:1)

您可以使用此代码在任何网址中重命名查询参数:

RewriteEngine On

# rename query parameter colornew=>color
RewriteCond %{QUERY_STRING} ^(.*&)?colornew=([^&]*)(&.*)?$ [NC]
RewriteRule ^ %{REQUEST_URI}?%1color=%2%3 [NC]

# rename query parameter productname=>product
RewriteCond %{QUERY_STRING} ^(.*&)?productname=([^&]*)(&.*)?$ [NC]
RewriteRule ^ %{REQUEST_URI}?%1product=%2%3 [NC,NE,L,R=302]

答案 1 :(得分:0)

尝试:

RewriteEngine on

RewriteCond %{THE_REQUEST} \?colornew=([^&]+)&productname=([^&\s]+)
RewriteRule ^ %{REQUEST_URI}?color=%1&product=%2 [QSA,NC,NE,L,R=301]

答案 2 :(得分:0)

anubhava 的其他优秀答案的简单修复:

RewriteEngine On

# rename query parameter colornew=>color
RewriteCond %{QUERY_STRING} ^(.*&)?colornew=([^&]*)(&.*|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?%1color=%2%3 [NC]

# rename query parameter productname=>product
RewriteCond %{QUERY_STRING} ^(.*&)?productname=([^&]*)(&.*|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?%1product=%2%3 [NC,NE,L,R=302]

不同的是,在重写条件的末尾,去掉了问号,并添加了一个“或”运算符:|。

原因是,如果没有这个变化,当最终匹配没有填充任何东西时,URL 变为 product.php?color=anyvalue&product=anyvalue%3 - (&.*)? - 因为该匹配部分中的问号表示它存在或不存在;如果不存在,则 %3 不存在,因此它只是作为字符串附加。相反, (&.*|) 表示匹配可以由与号加上任何内容填充,也可以由任何内容填充。这样,当没有任何内容并且 %3 不会附加到字符串时,%3 会变成 ""。