我尝试进行搜索并尝试了解如何使用(多个)查询字符串进行重定向,但我没有运气。我希望有人能帮助我理解这个问题:)
我正在开发此电子商务商店,人们正在搜索电子商务搜索输入,查找位于不同CMS中的内容。例如,单词“返回”。这不是电子商务系统中的产品,因此当然会返回结果错误(未找到产品)。
我的想法只是手动将这些quieres重定向到CMS中的正确着陆页。
以下是电子商务系统中“返回”的网址示例:
http://www.domain.com/catalog/search.php?mode=search&page=1&substring=return
这就是我想送人的地方:
http://www.domain.com/catalog/Returns.html
有关如何做到这一点的任何想法?提前谢谢!
答案 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。要获得更严格的匹配,请参阅下面的 &
成为问题。
以下资源可能会对将来有所帮助:
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等。