【问题标题】:.htaccess redirect based on a part of URL.htaccess 基于部分 URL 的重定向
【发布时间】:2022-01-27 05:29:26
【问题描述】:

网站崩溃后,重定向 php 脚本无法按预期工作。 我们试图修复它,但同时我们正在寻找一种快速的解决方案来重定向搜索引擎结果,以便我们的访问者至少可以在点击相关网页后访问。

url 结构或搜索引擎结果是这样的:

https://www.example.com/MainCategory/SubCategory_1/SubCategory_2/Product?page=1

我想使用 URL 的“SubCategory_2”部分重定向到类似这样的内容

https://www.example.com/SubCategory_2.php

所以在我们完全修复脚本之前,至少我们的访问者会看到一个相关的网页。

我很困惑...有什么想法吗? 谢谢

【问题讨论】:

  • “点击 relative 网页” - 在这种情况下,“相对”是什么意思? (搜索结果有 absolute URL。)“使用“SubDomain_2”部分” - 您发布的示例 URL 中没有“SubDomain_2”部分?示例 URL 的变量和静态部分是什么? ?page=1 查询字符串是否已修复?还是这也是可变的?
  • • “相对网页”是指“内容相关”(而不是“最新消息”->“新闻”)• 搜索结果,是的,有绝对 URL。 • “没有“SubDomain_2” - 已修复,拼写错误 • ?page=1 查询字符串未修复? • url 的所有部分都是可变的(MainCategory、SubCategory_1、SubCategory_2、Product、页面)
  • 我在这里找到了一个基本的解决方案htaccess redirect if URL contains a certain string 我创建了类似RewriteRule ^(.*)SubCategory_2(.*)$ https://example.com/SubCategory_2.php[L,R=301] 的东西并且工作得很好。
    我的问题是这是一个“静态解决方案”,因为“SubCategory_2”是一个变量。它适用于一个变量,但仍在寻找一种优雅的方式来处理“SubCategory_2”作为变量。
  • 不可能使“基本解决方案”完全可变。您不能在 URL 路径中搜索“某物”,除非它遵循特定的 模式(您怎么知道要搜索什么?)。但是,您发布的“基本解决方案”也不能按书面形式工作。请使用完整的.htaccess 文件和该指令就地编辑您的问题。

标签: apache .htaccess mod-rewrite


【解决方案1】:

要重定向指定的 URL,其中 all 部分是可变的(包括完全可变的,但存在查询字符串),那么您可以使用根顶部附近的 mod_rewrite 执行以下操作 @987654323 @ 文件(或者最重要的是,在任何现有的内部重写之前):

RewriteEngine On

RewriteCond %{QUERY_STRING} .
RewriteRule ^[^/]+/[^/]+/([^/]+)/[^/]+$ /$1.php [QSD,R=302,L]

QSD 标志是从重定向响应中丢弃原始查询字符串所必需的。

以上将重定向:

  • /MainCategory/SubCategory_1/SubCategory_2/Product?page=1/SubCategory_2.php
  • /foo/bar/baz/qux?something/baz.php

你可以test it here using this htaccess tester


更新:

很遗憾没有成功。我收到 404 错误。

如果指令与请求的 URL 不匹配,或者 /SubCategory_2.php 不存在,您将收到 404。

URL 是否被重定向?您在浏览器的地址栏中看到了什么?

如果没有重定向,则上述规则与请求的 URL 不匹配,并且该规则什么也不做。要么是因为:

  • URL 格式与问题中所述不符。
  • 规则在.htaccess 文件中的错误位置。如前所述,此规则需要靠近配置文件的顶部。

我在这里找到了一个基本的解决方案 htaccess 重定向如果 URL 包含某个字符串我创建类似 RewriteRule ^(.*)SubCategory_2(.*)$ https://example.com/SubCategory_2.php[L,R=301] 的东西并且工作得很好。我的问题是这是一个“静态解决方案”,因为“SubCategory_2”是一个变量。

好的,但是对于您似乎试图解决的问题,这是一个非常通用(可以说“太通用”)的解决方案。这将匹配 URL 路径中的任何位置(不仅仅是整个路径段)中的“SubCategory_2”,并通过重定向保留任何查询字符串(出现在您的示例 URL 上)。因此,这不会对您问题中的示例 URL 执行所述重定向。

但是,您发布的指令(您说“工作正常”)不可能像书面的那样工作,至少不能单独工作。忽略 flags 参数之前缺少的 空格(我认为是错字),这将导致无限的重定向循环,因为目标 URL /SubCategory_2.php 也与正则表达式 ^(.*)SubCategory_2(.*)$ 匹配。

另外,这应该是 301(永久)重定向吗?您似乎暗示这是一个“临时”解决方案?

但是,从技术上讲,在此“基本解决方案”中使“SubCategory_2”完全可变并在更大的字符串中搜索此变量“something”并重定向到“something.php”在技术上是不可能的。你怎么知道你找到了一个更大的 URL 的正确部分?您需要更具体地了解您要搜索的内容。

在您的原始问题中,您正在提取由 4 个路径段和一个查询字符串组成的 URL 路径中的第三个路径段。这是一个非常合理的模式,但是当您不知道“某物”是什么或在哪里时,您就无法提取“某物”。

【讨论】:

  • 感谢您的回答。我对其进行了测试,但不幸的是没有成功。我收到 404 错误。也许我没有用最好的方式表达这个问题,但提供的代码不起作用。另一方面,您似乎已经了解我想要完美地做的事情(考虑到您给出的示例,在您的回答末尾)
  • @amadou 显示 404 时地址栏中的 URL 是什么?
  • 我发布的规则应该与您问题中的示例 URL 匹配。你可以test it here using this htaccess tester。我已经更新了我的答案。 @amadou
  • 代码按预期工作。也许我在第一次尝试时打错了。
猜你喜欢
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 2016-05-06
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多