我现在已经搜索了几个小时,但我无法找到解决方案。 我刚刚建立了一个新网站,其搜索网址与旧网站不同。我正在尝试捕获指向旧网站的搜索查询并将其发送到新网站搜索。 如: 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]
任何帮助将不胜感激。
答案 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
样式文件)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。只有在您无法控制主机配置(读取:非常便宜的托管服务提供商)或者您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦)的情况下,它们才被支持作为最后一个选项。 )。