重写规则以将旧搜索转发到新搜索

时间:2017-07-14 08:35:15

标签: apache .htaccess mod-rewrite url-rewriting centos

我现在已经搜索了几个小时,但我无法找到解决方案。 我刚刚建立了一个新网站,其搜索网址与旧网站不同。我正在尝试捕获指向旧网站的搜索查询并将其发送到新网站搜索。 如: advanced_search_result.php search_in_description = 1&安培;关键字=交流发电机

重定向到新网站搜索: ?的index.php路线=产品/搜索和安培;搜索=交流发电机

我尝试过以下各种变化而没有任何运气。

RewriteRule ^advanced_search_result\.php?.*keywords=(.*)$ index.php?route=product/search&search=$1 [R=301,L]

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试映射包含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引用该规则本身的捕获。

详细信息在official documentation of the rewriting module中进行了解释,这是您在处理重写或重定向规则时应始终参考的内容。它编写得非常好,并附有很好的例子。

一般提示:您应该始终更喜欢将此类规则放在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess样式文件)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。只有在您无法控制主机配置(读取:非常便宜的托管服务提供商)或者您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)的情况下,它们才被支持作为最后一个选项。 )。