【问题标题】:301 redirect old parameter names to new parameter names by htaccess301 通过 htaccess 将旧参数名称重定向到新参数名称
【发布时间】:2015-12-31 14:54:29
【问题描述】:

我刚刚更改了两个参数名称,并希望将旧名称重定向到 URL 中任何位置具有任何值的已更改名称。例如:

product.php?colornew=anyvalue&productname=anyvalue

301 重定向到:

product.php?color=anyvalue&product=anyvalue

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

【问题讨论】:

  • 您是否查看了 Sumurai8 的链接答案?
  • 是的,但还没有找到我的答案
  • 可以帮助我弄清楚这与那个问题有什么关系吗?据我了解,该问题已删除参数名称,仅保留值。但我的问题是将旧参数名称重定向到新参数名称。

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


【解决方案1】:

您可以使用此代码重命名任何 URL 中的查询参数:

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]

【讨论】:

  • 又一次出色的工作!只是想知道我是否从您的代码中删除:“product\.php$”,如果我希望您的代码在任何页面上处理这项工作不是更好吗?
  • 哦,是的,这绝对没问题,您可以使用RewriteRule ^ %{REQUEST_URI}?%1product=%2%3 [NC,NE,L,R=302] 来制定这个通用的包罗万象的规则。
【解决方案2】:

试试:

RewriteEngine on

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

【讨论】:

  • 我想要 301 重定向,您的代码也更改了特殊字符。我认为你需要使用 NE
  • 将 R 更改为 R=301,是的,如果您的查询字符串值包含一些特殊字符,则使用 NE 标志很重要。
  • 能否请您在代码中更改它们以获得更好的参考,谢谢!
  • 我真的不知道该怎么做,请您使用您的 QSA 标志方法完成适用于任何 URL 的代码。
  • 我将 QUERY_STRING 变量更改为 THE_REQUEST,因为代码产生了重定向循环错误。
【解决方案3】:

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 变为 ""。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 2010-10-08
    • 2012-08-12
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多