【问题标题】:Strip parent categories from url从 url 中去除父类别
【发布时间】:2017-05-21 14:26:39
【问题描述】:

我正在努力解决 301 重定向和 .htaccess 的问题。我已将站点从旧域移动到新域。我已经成功地通过 301 重定向做到了这一点。像这样:

Redirect 301 / https://newdomain.com

在旧网站上,子类别 URL 是这样的:

olddomain.com/product-category/parent-cat1/parent-cat2/child-cat

olddomain.com/product-category/parent-cat1/child-cat

olddomain.com/product-category/child-cat

而在新网站上:

newdomain.com/product-category/child-cat

很遗憾,这会导致重定向出现 404。有什么方法可以从 URL 中删除父类别(可能因名称和数量而异)?

【问题讨论】:

  • "/parent-cat/parent-cat/" - parent-cat 的这两个实例是否相同?还是真的是/parent-cat1/parent-cat2/?你说parent-cat 的数量可以变化......从1 到多少? product-categorychild-cat 中包含哪些字符?
  • 抱歉没有更清楚。不,它们将是不同的父类别。我将编辑问题以澄清这一点。产品类别可以嵌套多远没有限制,但实际上不超过 5 或 6 级。字母数字字符和连字符。谢谢

标签: apache .htaccess redirect mod-alias


【解决方案1】:

尝试在您现有的Redirect 指令之前添加以下RedirectMatch 指令

RedirectMatch 302 ^/([\w-]+)/(?:[\w-]+/)+([\w-]+)$ https://newdomain.com/$1/$2

RedirectMatch 指令是对 Redirect 指令的补充,两者都是 mod_alias 的一部分。除了 RedirectMatch 指令使用正则表达式来匹配 URL 路径,而 Redirect 使用简单的前缀匹配。

这假设路径段(即“product-category”、“parent-cat”和“child-cat”)仅包含字符 a-zA-Z0-9_-(连字符)。这需要尽可能具体,以免匹配“太多”。需要一个或多个“父猫”。

$1 是对 pattern 中第一个捕获组的反向引用。 IE。 ([\w-]+)产品类别$2 是对第二个捕获组的反向引用,即。 ([\w-]+)pattern 的末尾,即 child-cat。中间的(?:....)“组”是非捕获组,因此没有适用于此的反向引用。

这是一个 302(临时)重定向。只有在正常工作时才将其更改为 301。使用 302 更容易测试,因为它们没有被浏览器缓存。因此,您需要在测试之前确保您的浏览器缓存已清除。

【讨论】:

  • 谢谢@user82217。为 302 的提醒干杯,从来不知道。目前它似乎工作正常,只需要进行更多测试。
  • 更复杂的是,我从未提到该站点位于子目录中,但这似乎有效:RedirectMatch 302 ^/sub-dir/([\w-]+)/(?: [\w-]+/)+([\w-]+)$newdomain.com/$1/$2
  • 如果站点位于子目录中,这就足够了。因此,大概您现有的 Redirect 指令实际上类似于:Redirect 301 /subdir https://newdomain.com?
  • 是的,没错。再次道歉,我最初的问题应该更清楚。我认为赏金会朝着你的方向发展!
  • 是的,已经测试了上述内容,但它不适用于具有 2 个以上父类别的网址。似乎与 1 个父类别一起工作正常,并按希望将其删除
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 2020-02-20
  • 2011-08-05
  • 1970-01-01
  • 2015-12-14
  • 2022-01-21
  • 2013-07-13
相关资源
最近更新 更多