【问题标题】:rewrite rule to forward old search to new search重写规则以将旧搜索转发到新搜索
【发布时间】:2017-12-19 06:47:54
【问题描述】:

我已经搜索了几个小时,但找不到解决方案。 我刚刚建立了一个新网站,其搜索 url 与旧网站不同。我正在尝试捕获指向旧站点的搜索查询并将它们发送到新站点搜索。 如: 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]

任何帮助将不胜感激。

【问题讨论】:

  • “没有任何锁”究竟是什么意思?发生什么了?您是否看到了重定向?这是错的吗?它会崩溃吗?宇宙会内爆吗?
  • 确保 http 服务器进程能够读取您的动态配置文件,确保完全启用此类文件的解释(AllowOverride 指令),检查您是否启用了重写模块并使用RewriteEngine on,确保文件位于正确系统上的正确位置并监控您的http服务器日志文件。
  • 还有一个一般提示:在 99% 的情况下,将此类重写规则放在旧主机配置中而不是使用动态配置文件更有意义。
  • 它根本不重定向。
  • 我在同一个文件中设置了其他重写规则,它们工作得很好。

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


【解决方案1】:

您的问题是您正在尝试映射包含查询字符串的模式,而 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 的 path 组件。查询字符串是 not 的一部分。只能在 RewriteCond 中使用 %{QUERY_STRING} 变量匹配查询字符串,因为这样的条件可以根据某种模式测试任意字符串,而不仅仅是 URL 的路径组件。在这样的条件内捕获的令牌然后可以由 %1 在随后的 RewriteRule 中引用,而不是 $1,后者指的是对该规则本身的捕获。

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


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

【讨论】:

  • 谢谢,能否详细说明重写条件与重写规则的工作原理?
  • 谢谢。现在这对我来说更有意义了。我已经阅读了一些文档,但感到困惑。最后一个问题,在您的示例中,为什么使用 %1 来引用搜索字符串而不是 %2?
  • 使用您的示例,我得到了重定向,但它不正确。它正在重定向到:/index.php?route=product/search&search=search_in_description=1
  • @StevenLutz 我必须道歉,我再次修改了答案,修复了条件。 %1 是正确的,但要使其正常工作,必须将第一个括号集标记为“非捕获组”((?:.....))。我后来添加了该组,以便在您的查询字符串中获得更大的灵活性,并忘记了该细节。我还修复了第二个捕获组,那里缺少抑扬符(^)...
  • 非常感谢!这是有效的。我现在对这一切是如何工作的有了更好的理解,但是我不明白如果你不打算捕获它,为什么要创建第一个组..换句话说,为什么要把第一个组放在 ( ) 如果你不打算参考它吗?另外,为什么最后一组由 [^\&]* 组成,而不是抓住所有东西 (.*) ?
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2012-03-06
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多