我有一些凌乱的旧网址,比如......
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语法吗?
干杯,
罗杰。
答案 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