我已经找了几个小时了,但我想不出解决办法。我刚刚张贴了一个新的网站,有一个不同的搜索网址与旧网站。我试图捕获针对旧站点的搜索查询,并将它们发送到新站点搜索。例如: advanced_search_result.php?search_in_description=1&keywords=alternator
重定向到新站点搜索,如: index.php?route=product/search&search=alternator
我试过以下几种没有任何运气的变体。
RewriteRule ^advanced_search_result\.php?.*keywords=(.*)$ index.php?route=product/search&search=$1 [R=301,L]
任何帮助都将不胜感激。
发布于 2017-07-14 09:05:24
您的问题是,您正在试图映射一个模式,其中包括查询字符串,这在RewriteRule
中是不可能的。这是很清楚的记录。为此,您需要使用RewriteCond
:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(?:[^&]*&)*keywords=([^\&]*)
RewriteRule ^/?advanced_search_result\.php$ /index.php?route=product/search&search=%1 [R=301,L]
原因是,在RewriteRule
中,模式只与请求URL的路径组件匹配。查询字符串不是其中的一部分。只有在使用RewriteCond
变量的%{QUERY_STRING}
中才能对查询字符串进行匹配,因为这样的条件可以针对某种模式测试任意字符串,而不仅仅是URL的路径组件。在这种情况下捕获的令牌随后可以由%1
在下面的RewriteRule
中引用,而不是引用引用该规则本身的捕获的$1
。
详细信息将在重写模块的正式文件中解释,在重写或重定向规则时,您应该始终参考这些细节。它写得很好,有很好的例子。
还有一个一般性提示:您应该总是倾向于将这样的规则放置在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess
样式文件)。众所周知,这些文件容易出错,很难调试,而且它们确实减慢了服务器的速度。只有当您无法控制主机配置(请阅读:真正便宜的主机服务提供商)或应用程序依赖于编写自己的重写规则(这显然是一场安全噩梦)时,它们才会被支持。
https://stackoverflow.com/questions/45098366
复制相似问题