【问题标题】:Redirecting URL with paramter to top-level domain将带参数的 URL 重定向到顶级域
【发布时间】:2021-06-09 08:25:15
【问题描述】:

我一直在尝试搜索,但还没有运气。找到关于重定向的不同选项,但与我正在寻找的不同。

因此,目前网站 URL 包含 lang 参数,例如 ?lang=en?lang=ru?lang=fi。参数位于 URL 的最后。

想法是将语言移动到顶级域。所以基本上我正在寻找一种将所有包含参数?lang=ru 的URL 重定向到顶级.ru 域的方法。其他语言也一样。

我可以通过.htaccess 完成,还是根本不应该这样做?将站点移动到不同的域应该需要重定向以将链接汁和权限传递到新域。

希望有人能引导我找到正确的方法。

非常感谢!

【问题讨论】:

  • 感谢您的链接!得到了一些更多的信息。没有将同一页面重定向到不同顶级域的示例。因此删除参数并移至新的顶级域。我会试着弄清楚。谢谢!
  • 这些网址能否包含您要保留的其他网址参数?
  • 不,新 URL 将不带参数,并且顶级域上的每种语言。我只需要确保从旧网址到新网址的重定向正确到位。

标签: wordpress .htaccess redirect wpml lang


【解决方案1】:

您应该可以通过 .hataccess 执行此操作。您可以在 .htaccess 中使用以下代码

RewriteEngine on

RewriteCond %{REQUEST_URI} lang=en
RewriteRule ^ https//wwww.yourwebsite.ext [L,R]

我认为如果您为所有其他人编写相同的内容,它应该可以正常工作。一定要试一试,然后告诉我。

【讨论】:

  • 已经测试过了,现在没有效果。它应该永久重定向到带有 lang=en 参数的所有链接,并将它们重定向到另一个顶级域的同一页面,对吗?找了一阵子,这里有点迷茫。
【解决方案2】:

如果没有其他 URL 参数需要保留,那么您可以使用 .htaccess 文件顶部附近的 mod_rewrite 进行如下操作:

RewriteEngine On

# Redirect "/foo?lang=xx" to "example.xx/foo"
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$
RewriteRule ^ https://example.%1%{REQUEST_URI} [QSD,R=302,L]

以上匹配由 2 个小写字母组成的 任何 语言代码。要匹配特定的语言代码,请在正则表达式中使用 alternation 并将RewriteCond 指令更改为:

RewriteCond %{QUERY_STRING} ^lang=(en|ru|fi|abc|etc)$

QSD 标志会丢弃重定向响应 (Apache 2.4) 中的原始 lang=xx 查询字符串。否则,这将默认复制到目标 URL。

%1 反向引用包含在前面的条件中捕获的lang URL 参数的值。 REQUEST_URI 服务器变量包含来自请求的完整 URL 路径(无查询字符串)。

这确实假设特定语言的 TLD 域托管在其他地方。换句话说,我们不需要检查我们是否已经在所需的 TLD 域中。

使用 302(临时)重定向进行测试,并且仅更改为 301(永久)重定向 - 如果这是有意的 - 一旦您确认这可以正常工作。


更新:任何特定的重定向,例如。 lang=en.com 需要先出现。例如:

# Redirect languages to .com
RewriteCond %{QUERY_STRING} ^lang=(en)$
RewriteRule ^ https://example.com%{REQUEST_URI} [QSD,R=302,L]

# All other language codes...
# Redirect "/foo?lang=xx" to "example.xx/foo"
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$
RewriteRule ^ https://example.%1%{REQUEST_URI} [QSD,R=302,L]

如果有更多语言代码,请使用 alternation(如上所述)。例如。 (en|gb).

【讨论】:

  • 我已更新我的答案以使用正则表达式替代作为替代方法 - 这提供了一些验证,前提是您没有匹配太多的语言代码。
  • 太棒了!这是近乎完美的解决方案。这里的 %1 反向引用有问题。参数是 ?lang=en 表示英语,但域是 .com。对于 ?lang=fi 和 ?lang=ru 这个语句会起作用,只是对 en 不起作用。所以我们可能应该手动声明它将被重定向到的域,我猜。
  • 啊,是的,当然(我应该知道没有.en TLD!)-我会更新我的答案。
  • 先生,您拯救了我的一天!这似乎工作得很好。一件事是当前的主站点位于爱沙尼亚语和 .com 域上。这是 .com 域上的主要语言,可以更改,但 URL 也会更改。它没有 ?lang 参数。有没有好方法可以将所有没有参数的 .com 链接重定向到 .ee 域?你是天使!谢谢!
  • 问题是它会与带有lang=en 的URL 发生冲突,这些URL 也会在没有?lang 参数的情况下重定向到.com? (所以,?lang=en 最终会被重定向两次并最终到达.ee TLD。)您说“URL 会改变”——它会如何改变?也许可以为规则构造一个例外?
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2014-02-18
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多