301基于.htaccess中的GET变量重定向URL

时间:2009-05-16 02:11:12

标签: .htaccess mod-rewrite query-string http-status-code-301

我有一些凌乱的旧网址,比如......

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变量。我无法弄清楚如何将重定向基于这些GET变量的值。任何人都可以帮忙!?我对旧的正则表达方式非常方便,所以如果必须的话我可以使用mod-rewrite,但是我不清楚重写GET变量的语法,我宁愿避免性能损失并使用清除Redirect指令。有办法吗?如果没有,任何人都可以提出正确的mod-rewrite语法吗?

干杯,

罗杰。

3 个答案:

答案 0 :(得分:5)

由于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。最简单的是带有对的纯文本文件:

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]

答案 1 :(得分:1)

答案 2 :(得分:0)

总之,您可以将RedirectMatch与正则表达式匹配,包括查询字符串。这将允许您重新排列URL的部分内容,但如果您必须执行“opendocument& part = 1”之类的转换为“welcome”(新URL与原始URL完全不同),则可能需要{{1 - 或者更好,只需将所有URL发送到RewriteMap并在PHP中解析查询字符串。

编辑:如果只是几个要重定向的网址,您可能会写出个别规则,例如

page.php