.htaccess 重定向基于 URL 的一部分
.htaccess redirect based on a part of URL
站点崩溃后,重定向 php 脚本无法按预期工作。
我们试图修复它,但与此同时,我们正在寻找一种快速解决方案来重定向搜索引擎结果,以便我们的访问者至少可以在单击相关网页后访问。
url结构或搜索引擎结果是这样的:
https://www.example.com/MainCategory/SubCategory_1/SubCategory_2/Product?page=1
我想使用 URL 的“SubCategory_2”部分重定向到类似这样的内容
https://www.example.com/SubCategory_2.php
所以在我们完全修复脚本之前,至少我们的访问者会看到一个相关的网页。
我很困惑...有什么想法吗?
谢谢
要重定向规定的 URL,其中 所有 部分都是可变的(包括完全可变的,但存在查询字符串),那么您可以使用以下方法执行类似以下操作mod_rewrite 靠近根 .htaccess
文件的顶部(或者重要的是,在任何现有的内部重写之前):
RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^[^/]+/[^/]+/([^/]+)/[^/]+$ /.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.
更新:
unfortunately without success. I get 404 error.
如果指令与请求的 URL 不匹配,或者 /SubCategory_2.php
不存在,您将收到 404。
URL 是否重定向?您在浏览器的地址栏中看到了什么?
如果没有重定向,则上述规则与请求的 URL 不匹配,并且该规则不执行任何操作。要么是因为:
- URL 格式与问题中所述不符。
- 规则在
.htaccess
文件中的错误位置。如前所述,此规则需要靠近配置文件的顶部。
I found a basic solution here htaccess redirect if URL contains a certain string I crate something like this RewriteRule ^(.*)SubCategory_2(.*)$ https://example.com/SubCategory_2.php[L,R=301]
and works just fine. My problem is that this is a "static solution" since "SubCategory_2" is a variable.
好的,但对于您似乎要解决的问题,这是一个非常通用(可以说是“太通用”)的解决方案。这匹配 URL-path 中任何位置的“SubCategory_2”(不仅仅是整个路径段)并且 保留 任何查询字符串(出现在您的示例 URL 中)通过重定向。因此,这不会对您问题中的示例 URL 执行规定的重定向。
但是,您发布的指令(您说“工作得很好”)不可能像写的那样工作,至少不能单独工作。忽略 flags 参数之前缺少的 space(我认为是错字),这将导致无休止的重定向循环,因为目标 URL /SubCategory_2.php
也匹配正则表达式 ^(.*)SubCategory_2(.*)$
.
此外,这应该是 301(永久)重定向吗?您似乎在暗示这是一个“临时”解决方案?
但是,在这个“基本解决方案”中使“SubCategory_2”完全可变并在更大的字符串中搜索这个变量“something”并重定向到“something.php”在技术上是不可能的.你怎么知道你找到了更大 URL 的正确部分?您需要更具体地说明要搜索的内容。
在您的原始问题中,您正在提取 URL-path 中的第 3 个路径段,该路径段由 4 个路径段和一个查询字符串组成。这是一个非常合理的模式,但是当您不知道“某物”是什么或在哪里时,您无法提取“某物”。
站点崩溃后,重定向 php 脚本无法按预期工作。 我们试图修复它,但与此同时,我们正在寻找一种快速解决方案来重定向搜索引擎结果,以便我们的访问者至少可以在单击相关网页后访问。
url结构或搜索引擎结果是这样的:
https://www.example.com/MainCategory/SubCategory_1/SubCategory_2/Product?page=1
我想使用 URL 的“SubCategory_2”部分重定向到类似这样的内容
https://www.example.com/SubCategory_2.php
所以在我们完全修复脚本之前,至少我们的访问者会看到一个相关的网页。
我很困惑...有什么想法吗? 谢谢
要重定向规定的 URL,其中 所有 部分都是可变的(包括完全可变的,但存在查询字符串),那么您可以使用以下方法执行类似以下操作mod_rewrite 靠近根 .htaccess
文件的顶部(或者重要的是,在任何现有的内部重写之前):
RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^[^/]+/[^/]+/([^/]+)/[^/]+$ /.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.
更新:
unfortunately without success. I get 404 error.
如果指令与请求的 URL 不匹配,或者 /SubCategory_2.php
不存在,您将收到 404。
URL 是否重定向?您在浏览器的地址栏中看到了什么?
如果没有重定向,则上述规则与请求的 URL 不匹配,并且该规则不执行任何操作。要么是因为:
- URL 格式与问题中所述不符。
- 规则在
.htaccess
文件中的错误位置。如前所述,此规则需要靠近配置文件的顶部。
I found a basic solution here htaccess redirect if URL contains a certain string I crate something like this
RewriteRule ^(.*)SubCategory_2(.*)$ https://example.com/SubCategory_2.php[L,R=301]
and works just fine. My problem is that this is a "static solution" since "SubCategory_2" is a variable.
好的,但对于您似乎要解决的问题,这是一个非常通用(可以说是“太通用”)的解决方案。这匹配 URL-path 中任何位置的“SubCategory_2”(不仅仅是整个路径段)并且 保留 任何查询字符串(出现在您的示例 URL 中)通过重定向。因此,这不会对您问题中的示例 URL 执行规定的重定向。
但是,您发布的指令(您说“工作得很好”)不可能像写的那样工作,至少不能单独工作。忽略 flags 参数之前缺少的 space(我认为是错字),这将导致无休止的重定向循环,因为目标 URL /SubCategory_2.php
也匹配正则表达式 ^(.*)SubCategory_2(.*)$
.
此外,这应该是 301(永久)重定向吗?您似乎在暗示这是一个“临时”解决方案?
但是,在这个“基本解决方案”中使“SubCategory_2”完全可变并在更大的字符串中搜索这个变量“something”并重定向到“something.php”在技术上是不可能的.你怎么知道你找到了更大 URL 的正确部分?您需要更具体地说明要搜索的内容。
在您的原始问题中,您正在提取 URL-path 中的第 3 个路径段,该路径段由 4 个路径段和一个查询字符串组成。这是一个非常合理的模式,但是当您不知道“某物”是什么或在哪里时,您无法提取“某物”。