301 基于 .htaccess 中的 GET 变量重定向 URL
Posted
技术标签:
【中文标题】301 基于 .htaccess 中的 GET 变量重定向 URL【英文标题】:301 Redirecting URLs based on GET variables in .htaccess 【发布时间】:2010-10-26 16:05:14 【问题描述】:我有一些乱七八糟的旧网址,例如...
http://www.example.com/bunch.of/unneeded/crap?opendocument&part=1
http://www.example.com/bunch.of/unneeded/crap?opendocument&part=2
...我想重定向到更新、更简洁的表单...
http://www.example.com/page.php/welcome
http://www.example.com/page.php/prices
我知道我可以通过简单的重定向将一个页面重定向到另一个页面,即
重定向 301 /bunch.of/unneeded/crap http://www.example.com/page.php
但源页面没有改变,只是它是 GET vars。我不知道如何将重定向基于这些 GET 变量的值。有人可以帮忙吗!?我对旧的正则表达式相当方便,所以如果必须的话,我可以使用 mod-rewrite,但我不清楚重写 GET vars 的语法,我宁愿避免性能下降并使用更清洁的重定向指令。有办法吗?如果没有,任何人都可以告诉我正确的 mod-rewrite 语法吗?
干杯,
罗杰。
【问题讨论】:
您确定要将/bunch.of/unneeded/crap?opendocument&part=1
的请求重定向到/page.php/welcome
而不是反过来吗?
【参考方案1】:
由于 URL 查询中的参数可能具有任意顺序,因此您需要为每个要检查的参数或每个可能的排列使用一个 RewriteCond
directive。
这是一个为每个参数添加 RewriteCond
指令的示例:
RewriteCond %QUERY_STRING ^([^&]&)*opendocument(&|$)
RewriteCond %QUERY_STRING ^([^&]&)*part=1(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/welcome? [L,R=301]
RewriteCond %QUERY_STRING ^([^&]&)*opendocument(&|$)
RewriteCond %QUERY_STRING ^([^&]&)*part=2(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/prices? [L,R=301]
但正如您所见,这可能会变得一团糟。
因此,更好的方法可能是使用RewriteMap
。最简单的是带有 key 和 value 对的纯文本文件:
1 welcome
2 prices
要定义您的地图,请在您的服务器或虚拟主机配置中编写以下指令(在每个目录上下文中不允许此指令):
RewriteMap examplemap txt:/path/to/file/map.txt
那么你只需要一条规则:
RewriteCond %QUERY_STRING ^([^&]&)*opendocument(&|$)
RewriteCond %QUERY_STRING ^([^&]&)*part=([0-9]+)(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/%examplemap:%2? [L,R=301]
【讨论】:
这还不是我能告诉你的全部。您也可以使用 PHP 脚本来解决此问题。 id 甚至可能更好,因为 PHP 是一种比 mod_rewrite 更强大的语言。但是您要求提供 mod_rewrite 解决方案。【参考方案2】:RewriteCond %QUERY_STRING option=com_content&task=view&id=70&Itemid=82
RewriteRule ^index.php http://www.example.com/business/banks/? [R=301,L]
那个?将防止用户被发送到的 url 具有与原始页面相同的查询字符串。
【讨论】:
【参考方案3】:总之,您可以将RedirectMatch
与将匹配完整URL(包括查询字符串)的正则表达式一起使用。这将允许您重新排列 URL 的各个部分,但如果您必须将“opendocument&part=1”转换为“welcome”(新 URL 与原始 URL 完全不同),您可能需要一个 RewriteMap
- 或或许更好,只需将所有 URL 发送到 page.php
并在 PHP 中解析查询字符串。
编辑:如果你只是想重定向几个 URL,你可能会写出单独的规则,比如
RedirectPermanent http://www.example.com/bunch.of/unneeded/crap?opendocument&part=1 http://www.example.com/page.php/welcome
RedirectPermanent http://www.example.com/bunch.of/unneeded/crap?opendocument&part=2 http://www.example.com/page.php/prices
【讨论】:
Redirect
仅适用于 URL 路径,不适用于 URL 查询。以上是关于301 基于 .htaccess 中的 GET 变量重定向 URL的主要内容,如果未能解决你的问题,请参考以下文章
apache 2.4中的htaccess重定向301不起作用