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



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

重定向到新网站搜索,例如: 索引.php?路线=产品/搜索&搜索=交流发电机

我尝试了以下变体,但没有任何运气。

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

任何帮助将不胜感激。

您的问题是您正在尝试映射包含查询字符串的模式,这在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 的路径组件匹配。查询字符串不是其中的一部分。只有在使用%{QUERY_STRING}变量的RewriteCond中才能与查询字符串进行匹配,因为此类条件可以针对某种模式(而不仅仅是 URL 的路径组件)测试任意字符串。在这样的条件下捕获的令牌可以在以下RewriteRule中被%1引用,而不是引用该规则本身的捕获的$1

细节在重写模块的官方文档中进行了解释,这是您在处理重写或重定向规则时应始终参考的内容。它写得很好,并带有很好的例子。


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

最新更新