.Htaccess重定向多个查询字符串

时间:2014-02-21 18:38:12

标签: .htaccess redirect

我尝试进行搜索并尝试了解如何使用(多个)查询字符串进行重定向,但我没有运气。我希望有人能帮助我理解这个问题:)

我正在开发此电子商务商店,人们正在搜索电子商务搜索输入,查找位于不同CMS中的内容。例如,单词“返回”。这不是电子商务系统中的产品,因此当然会返回结果错误(未找到产品)。

我的想法只是手动将这些quieres重定向到CMS中的正确着陆页。

以下是电子商务系统中“返回”的网址示例:

http://www.domain.com/catalog/search.php?mode=search&page=1&substring=return

这就是我想送人的地方:

http://www.domain.com/catalog/Returns.html

有关如何做到这一点的任何想法?提前谢谢!

2 个答案:

答案 0 :(得分:5)

解决方案

这样做的方式就像菲尔所说的那样;但有一些(小的)修改:

RewriteEngine On
RewriteCond %{QUERY_STRING}  substring=returns?  [NC]
RewriteRule  . /catalog/Returns.html? [L]
RewriteCond %{QUERY_STRING}  substring=shipping  [NC]
RewriteRule  . /catalog/Shipping.html? [L]

N.B。如果您只想删除一个参数,请参阅下面的其他信息和说明

N.B。要获得更严格的匹配,请参阅下面的 &成为问题



解释

背景

我解释差异的最佳方式(上述与菲尔原创之间的区别)以及你遇到问题的原因是解释发生了什么......

RewriteCond %{QUERY_STRING} substring=returns? [NC]检查查询字符串中是否有正则表达式的实例,在这种情况下substring=returns? *。

[NC]标志仅表示匹配大写和小写字母。

*澄清:正则表达式(substring=returns?)表示substr=return字面上与是否有s匹配。

问题

如果满足条件(即在查询字符串中匹配正则表达式模式),则触发重写规则。这就是问题所在......

鉴于网址:http://example.com/?substring=returns

原始规则:

RewriteRule  . /catalog/Returns.html [L]

重写保留查询字符串的URL,如下所示:

http://example.com/?substring=returns
http://example.com/catalog/Returns.html?substring=returns
http://example.com/catalog/Returns.html?substring=returns
http://example.com/catalog/Returns.html?substring=returns
http://example.com/catalog/Returns.html?substring=returns
...and so on until limit is reached...

旁注[L]标志会阻止.htaccess文件执行更多规则,但它不会再次停止循环播放。

解决方案

然后解决方案是覆盖查询字符串(因为我们不再需要它),只需在?的末尾添加RewriteRule即可实现此目的:

RewriteRule  . /catalog/Returns.html? [L]

N.B。如果您只想删除一个参数,请参阅下面的其他信息和说明

N.B。要获得更严格的匹配,请参阅下面的 &成为问题



资源

以下资源可能会对将来有所帮助:

.htaccess flags

http://httpd.apache.org/docs/current/rewrite/flags.html

正则表达式

http://www.regular-expressions.info/ - 查看教程部分



其他信息和说明

&成为问题的地方

RewriteCond %{QUERY_STRING}  &substring=returns?  [NC]

在上面,正则表达式意味着将字符&substring=return与附加的可选s进行匹配。

所以它会按预期匹配以下内容:

http://example.com/?var1=somvalue&substring=return
http://example.com/?var1=somvalue&substring=returns
http://example.com/?var1=somvalue&substring=return&var2=othervalue
http://example.com/?var1=somvalue&substring=returns&var2=othervalue

哪个好,并且给定原始查询字符串不会有问题,但是,如果我要导航到页面并以不同的顺序写入参数,&将不会; t必然存在,因此它不匹配(当它应该):

http://example.com/?substring=return&var1=somevalue
http://example.com/?substring=returns&var1=somevalue

简单地摆脱它(就像我一样)可以解决这个问题,但它没有风险。

RewriteCond %{QUERY_STRING}  substring=returns?  [NC]

如果您要引入一个新参数secondsubstring,例如它应该匹配时不应该:

Good Match > http://example.com/?substring=return&var1=somevalue
Good Match > http://example.com/?var1=somevalue&substring=return
Bad  Match > http://example.com/?secondsubstring=return&var1=somevalue

要解决此潜在问题,您可以执行以下操作:

RewriteCond %{QUERY_STRING}  ^(.*&)?substring=returns?

以上将匹配:

http://example.com/?substring=return&var1=somevalue
http://example.com/?var1=somevalue&substring=return

但是没赢得比赛:

http://example.com/?secondsubstring=return&var1=somevalue

另一个潜在的问题是表达式匹配:

http://example.com/?substring=returning&var1=somevalue
http://example.com/?substring=return%20television&var1=somevalue

我的理解是,在特定情况下,这不会成为问题。但是,如果这是一个问题,你可以这样做:

RewriteCond %{QUERY_STRING}  ^(.*&)?substring=returns?(&|$)

以上检查return / returns后面的字符是&发出变量结束信号并开始新变量的信息查询字符串的结尾。

重写一个参数

在某些情况下,菲尔指出,最好一次只删除一个参数,并保持查询字符串的其余部分不受影响。

您可以非常简单地通过在RewriteCond中实施捕获组并在RewriteRule中输出它们来完成此操作:

RewriteCond %{QUERY_STRING}  ^(.*&)?substring=returns?(&.*)?$  [NC]
RewriteRule  . /catalog/Shipping.html?%1%2 [L]

重写说明

使用%N从重写条件插入捕获组,并使用$N从重写规则插入捕获组。

所以在这种情况下我们重定向到:

/catalog/shipping.html?(RewriteCond Group1)(RewriteCond Group2)
/catalog/Shipping.html?%1%2

[L]标志 - 如前所述 - 停止处理.htaccess文件中的任何规则

正则表达式解释

^(.*&)?substring=returns?(&.*)?$
  • ^字符串开头
  • (.*&)?第一个捕获组
    • 捕获任何字符. 0次或更多次*
    • 后跟&
    • ?使整个论坛成为可选
  • substring=returns?substring=return字面上与可选的s
  • 匹配
  • (&.*)?第二个捕获组
    • 捕获&
    • 捕获任何字符. 0次或更多次*
    • ?再次使该组成为可选
  • $字符串结尾

[L]标志与[END]

为了完整起见......

[L]标记阻止.htaccess越过.htaccess文件中的更多规则。

[END]标志完全停止重写过程。

举例说明:

while(TRUE){
    if(condition1){ continue; }
    if(condition2){ continue; }
    if(condition3){ continue; }
    if(condition4){ continue; }
}


while(TRUE){
    if(condition1){ break; }
    if(condition2){ break; }
    if(condition3){ break; }
    if(condition4){ break; }
}

在上面的代码块中,[L]标志的作用类似于continue语句,因为它会跳过代码块的其余部分并重新启动。虽然[END]标志充当break语句并完全停止循环。

如果我们要在Phil的原始答案中用[L]替换[END]标记,那么它就可以了。有了上面 &成为问题部分中提到的警告。

答案 1 :(得分:0)

RewriteEngine On
RewriteCond %{QUERY_STRING}  &substring=returns?  [NC]
RewriteRule  . /catalog/Returns.html [L]
RewriteCond %{QUERY_STRING}  &substring=shipping  [NC]
RewriteRule  . /catalog/Shipping.html [L]

etc.

这样的事情能为你完成这项工作吗?请注意'返回?'意思是'回报'或'回报'。您一次只能限制一个搜索字词,还是客户可以输入短语?我&在那里使用是安全的,但它可能不是。

不要忘记执行任何命令提前以重写Returns.html到Returns.php,做SEO等。