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

301基于.htaccess中的GET变量重定向URL,.htaccess,mod-rewrite,query-string,http-status-code-301,.htaccess,Mod Rewrite,Query String,Http Status Code 301,我有一些乱七八糟的旧网址,比如 …我想重定向到更新、更干净的表单 我知道我可以通过一个简单的重定向将一个页面重定向到另一个页面 重定向301/bunch.of/unneeded/crap 但是源页面没有改变,只有GET VAR。我不知道如何根据这些GET变量的值进行重定向。有人能帮忙吗!?我对旧的正则表达式很在行,因此如果有必要,我可以尝试使用mod rewrite,但我不清楚重写GET vars的语法,我更喜欢避免性能问题,并使用cleaner Redirect指令。有办法吗?如果没有

我有一些乱七八糟的旧网址,比如

…我想重定向到更新、更干净的表单

我知道我可以通过一个简单的重定向将一个页面重定向到另一个页面

重定向301/bunch.of/unneeded/crap

但是源页面没有改变,只有GET VAR。我不知道如何根据这些GET变量的值进行重定向。有人能帮忙吗!?我对旧的正则表达式很在行,因此如果有必要,我可以尝试使用mod rewrite,但我不清楚重写GET vars的语法,我更喜欢避免性能问题,并使用cleaner Redirect指令。有办法吗?如果没有,谁能告诉我正确的mod重写语法

干杯


罗杰。

总之,您可以将
重定向匹配
与正则表达式一起使用,正则表达式将匹配完整的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

由于URL查询中的参数可能具有任意顺序,您需要为每个要检查的参数或每个可能的排列使用一个参数

下面是一个示例,每个参数都有一个
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]
但正如你所看到的,这可能会变得一团糟

因此,更好的方法可能是使用。最简单的方法是包含键和值对的纯文本文件:

要定义映射,请在服务器或虚拟主机配置中写入以下指令(每个目录上下文中不允许使用此指令):

那么你只需要一条规则:

RewriteCond %{QUERY_STRING} ^([^&]&)*opendocument(&|$)
RewriteCond %{QUERY_STRING} ^([^&]&)*part=([0-9]+)(&|$)
RewriteRule ^bunch\.of/unneeded/crap$ /page.php/%{examplemap:%2}? [L,R=301]

那个?将阻止用户发送到的url与源页面具有相同的查询字符串。

重定向
只对url路径有效,而不对url查询有效。是否确实要将
/bunch.of/unneeded/crap?opendocument&part=1
的请求重定向到
/page.php/welcome
而不是相反方向?这就是甚至不是我能告诉你的一切。您还可以使用PHP脚本来解决此问题。id甚至可能更好,因为PHP是一种比mod_rewrite更强大的语言。但是你已经要求了一个mod_重写解决方案。
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]
RewriteCond %{QUERY_STRING} option=com_content&task=view&id=70&Itemid=82
RewriteRule ^index.php http://www.example.com/business/banks/? [R=301,L]