【问题标题】:301 redirect for old urls with language parameter带有语言参数的旧网址的 301 重定向
【发布时间】:2016-12-16 21:14:11
【问题描述】:

我的 apache htaccess 文件需要一些 301 重定向。旧的 url 在末尾包含变量并具有如下结构:

/furniture-248/category/570-shelves.html?lang=en
/all-products/furniture-248/shelves.html?page=2&lang=en
/store/product/asearch.html?path=7_632&lang=en&Itemid=284

新的 url 不包含这种性质的参数,并且只是以下形式:

main-cat/subcat/sale.html

我在 htaccess 文件中尝试了一个常规的 301 重定向,它适用于没有参数的 url,但那些包含 ?lang=en 的 url 根本不起作用。

这是我正在尝试的:

Redirect 301 /furniture-248/category/570-shelves.html?lang=en http://www.domain.com/shelves.html

如果您能提供任何帮助和建议,我将不胜感激。

在此先感谢

【问题讨论】:

  • 也显示你的 htaccess
  • 是的,需要看看你是如何尝试这样做才能提供修复。
  • 编辑帖子以显示我正在尝试的内容
  • 谢谢,我添加了答案。

标签: apache .htaccess redirect mod-rewrite


【解决方案1】:

您不能将查询字符串用作这样的重定向的一部分。你有两个选择。

选项 1

去掉“?lang=en”部分,只重定向该 URL 的所有实例,不管查询字符串是什么。

Redirect 301 /furniture-248/category/570-shelves.html http://www.domain.com/shelves.html

这将使查询字符串保持原样,因此新 URL 将包含“?lang=en”(如果存在)或任何其他查询字符串。

当然,您可能只需要在它包含“?lang=en”部分时才重定向它,或者在重定向时保留查询字符串不变可能是不可接受的。在这种情况下,它需要...

选项 2

使用 mod_rewrite:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=en$
RewriteRule ^furniture-248/category/570-shelves\.html$ http://www.domain.com/shelves.html? [R=301,L]

这完全符合您的要求,将/furniture-248/category/570-shelves.html?lang=en 重定向到http://www.domain.com/shelves.html,仅此而已。

请注意..

  • 查询字符串单独匹配。

  • 不使用匹配部分的正斜杠(因为您在网站根级 .htaccess 文件中的事实意味着该正斜杠)。

  • 重定向 URL 上的结束问号很重要,因为它告诉引擎删除现有的查询字符串,这是您想要的。

  • [R=301,L] 表示进行 301 重定向,不再处理此 URL 上的任何 URL 重写。

  • 对于RewriteRule中的匹配部分,“html”前面的点用“\”转义,因为点在正则表达式中具有特殊含义。

  • 对于匹配部分,在 RewriteCond 和 RewriteRule 中,^ 表示字符串的开头,$ 表示字符串的结尾,因此我们完全匹配,而不是它可能成为较长字符串的一部分。

最后,如果您要添加其中的一些,您只需要在顶部的“RewriteEngine On”部分一次。其他两部分是每个都需要的。

请务必测试您使用此方法添加的所有重定向,因为 mod_rewrite 的内容比我在这个简单说明中提到的要多。

【讨论】:

  • 感谢您的详细回复。使用选项 1,如果我像您一样只添加重定向,而没有查询字符串,则带有查询字符串的完整 url 的重定向不起作用。这些带有查询字符串的 url 是它们在谷歌分析中的显示方式,所以我想确保它们不会出现 404 错误。正如我所说,在没有查询字符串的情况下尝试会导致带有查询字符串的完整 url 产生 404 错误。
  • 我对此做了一些进一步的调查,并稍微更新了答案。选项 1“重定向”指令将在有或没有查询字符串的情况下工作,但如果查询字符串存在,它不会将其从新 URL 中删除。因此,您的新 URL 也将包含“?lang=en”部分。你说的情况是这样吗? /furniture-248/category/570-shelves.html?lang=en 正在重定向到 http://www.domain.com/shelves.html?lang=en 也许发布您的代码以确认。如果这是正在发生的事情,而且是不可接受的,那么选项二就是您所需要的。
  • 最后,我使用了您的选项 2,效果非常好。这有点费力,因为我要输入很多,但效果很好。谢谢
  • 是的,不幸的是,没有快速的方法可以在不使用 mod_rewrite 的情况下进行包括查询字符串的重定向。 Mod_rewrite 非常强大,因此很复杂,但会使这样的事情有点费力。很高兴它对你有用。
猜你喜欢
  • 1970-01-01
  • 2016-09-01
  • 2013-03-30
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多