【问题标题】:How can I wildcard redirect everything after a certain URL in htaccess?如何在 htaccess 中的某个 URL 之后重定向所有内容?
【发布时间】:2022-01-30 10:07:34
【问题描述】:

我们最近对我们的一个网站进行了更改,其中需要通过 htaccess 重定向大量 URL,但我们还需要考虑可能附加在 URL 之后的任何其他信息。

我可以按预期获取要重定向的特定 URL,但之后不能使用其他字符。我知道有时像this thread 提到的文件中的顺序规则很重要,但这些重定向不应该有任何冲突的规则。

这些都是特定的 URL,所以 this thread 关于匹配 URL 结构中的特定单词对我们的问题不起作用。

看起来 FOO/BAR/BAZ 到 FOO/NEW/BAZ example 也不适用。

我认为我们的缓存可能会影响它,但其他更改已立即实施,所以我认为这只是语法问题

我们 htaccess 中的当前格式示例 URL:

Redirect 301 /product/product-name/ https://example.com/announcements/

需要发生的事情:人们对 /product/product-name/ 的任何传入直接链接,包括尾部斜杠后的任何内容,例如 /product/product-name/ref/123/也应该被重定向到/announcements/,但事实并非如此,这些类型的链接将指向我们的 404 页面。

尝试的解决方案:到目前为止(今天 - 这不是我第一次尝试这个),我已经尝试了以下方法来通配我的 301没有成功:

所以问题:Wildcard redirect at end of url in .htaccess

所以问题:Wildcard RewriteRule for 301 redirects in htaccess

外部参考:https://bootstrapcreative.com/how-to-redirect-known-pages-and-catch-all-for-everything-else-htaccess/

我愿意接受建议并感谢任何建议!

【问题讨论】:

  • 您实际上还没有明确说明您要做什么?您要匹配哪些 URL?预期的目标 URL 是什么?请举例。 “我们还需要说明可能附加在 URL 之后的任何附加信息”——您需要以何种方式“说明”这些“附加信息”?而这个“附加信息”究竟是什么?这是 URL 路径的一部分吗?还是查询字符串?还是别的什么?
  • 我们还需要查看您正在使用的非工作指令。我们可能还需要查看包含此指令的完整 .htaccess 文件,同时您声明“不应该有任何冲突的规则” - 冲突的规则是一个非常常见的错误原因。
  • 啊,是的,对不起,怀特先生,好电话。本质上,我们已经将大量 URL 重定向到另一个我们活跃的站点,并且重定向了确切的 URL。不过,我们的网站上有一个附属计划,后来我们想到任何附属链接都不会被重定向,例如 /ref/123/ 会出现在 URL 的末尾。目前这是 404。
  • 工作规则是这样的:重定向 301 /product/name/ example.com/announcements - 只要它是确切的 URL,就可以,但尝试 any提供的我在我的 OP 中链接到的示例没有任何不同。
  • (您需要编辑您的问题以包含该附加信息 - 同时保留格式。)但是,您在评论中发布的 Redirect 指令应该已经满足您的要求......它会将/product/name/ref/123/ 重定向到https://example.com/announcements/ref/123/。那是你想要发生的事情吗?这不是正在发生的事情吗?但是,我们需要在完整的 .htaccess 文件中查看您的实际规则。请编辑您的问题以包含此信息。

标签: .htaccess redirect wildcard


【解决方案1】:
Redirect 301 /product/product-name/ https://example.com/announcements/

mod_alias Redirect 指令是前缀匹配的,匹配后的所有内容都复制到目标 URL 的末尾。因此,例如,对/product/product-name/ref/123/ 的请求将被重定向到https://example.com/announcements/ref/123/(因为ref/123/ 是与/product/product-name/ 匹配后URL 路径的剩余部分)。它似乎是目标 URL,即。 https://example.com/announcements/ref/123/,这导致了 404,所以重定向正在发生。

要将/product/product-name/<anything> 重定向到https://example.com/announcements/,那么您需要改用RedirectMatch 指令,该指令使用正则表达式进行匹配,而不是简单的前缀匹配。

例如:

RedirectMatch 301 ^/product/product-name/ https://example.com/announcements/

这将重定向如下:

  • /product/product-name/https://example.com/announcements/
  • /product/product-name/ref/123/https://example.com/announcements/
  • /product/product-name/<anything>https://example.com/announcements/

如果您需要更具体,例如。仅匹配可选的附属链接,例如。 /ref/<number>/,而不是字面上的 anything,然后改为执行以下操作:

RedirectMatch 301 ^/product/product-name/(ref/\d+/)?$ https://example.com/announcements/

如 cmets 中所述,您应首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并且您需要在测试前清除浏览器缓存,因为错误的 301(永久)重定向将被浏览器缓存。

但是,如果您已经在配置文件的其他地方使用了 mod_rewrite (RewriteRule) 指令,那么您可能需要(或者更可取)使用 mod_rewrite 进行此重定向。

参考:

【讨论】:

  • 怀特先生,工作就像一个魅力。非常感谢! 另外 vm 欣赏 301 与 302 的技巧,一定会记住这一点。
猜你喜欢
  • 2021-05-01
  • 2013-03-05
  • 2018-06-13
  • 2012-11-04
  • 2016-06-02
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2018-07-26
相关资源
最近更新 更多