Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 重写规则以将旧搜索转发到新搜索_Apache_.htaccess_Mod Rewrite_Url Rewriting_Centos - Fatal编程技术网

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

Apache 重写规则以将旧搜索转发到新搜索,apache,.htaccess,mod-rewrite,url-rewriting,centos,Apache,.htaccess,Mod Rewrite,Url Rewriting,Centos,我已经找了几个小时了,但我想不出一个解决办法。 我刚刚建立了一个新网站,它的搜索url与旧网站不同。我试图捕获指向旧站点的搜索查询,并将它们发送到新站点搜索。 例如: 高级搜索结果.php?搜索描述=1和关键字=1 重定向到新网站搜索,如: php?路径=产品/搜索&搜索=产品 我已经尝试了以下的变化,但没有任何运气 RewriteRule ^advanced_search_result\.php?.*keywords=(.*)$ index.php?route=product/search&a

我已经找了几个小时了,但我想不出一个解决办法。 我刚刚建立了一个新网站,它的搜索url与旧网站不同。我试图捕获指向旧站点的搜索查询,并将它们发送到新站点搜索。 例如: 高级搜索结果.php?搜索描述=1和关键字=1

重定向到新网站搜索,如: php?路径=产品/搜索&搜索=产品

我已经尝试了以下的变化,但没有任何运气

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

任何帮助都将不胜感激

您的问题是,您正在尝试映射包含查询字符串的模式,而使用
重写规则
是不可能的。这是有明确记录的。您需要使用
RewriteCond
进行以下操作:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^(?:[^&]*&)*keywords=([^\&]*)
RewriteRule ^/?advanced_search_result\.php$ /index.php?route=product/search&search=%1 [R=301,L]
原因是在重写规则中,模式仅与请求URL的路径组件匹配。查询字符串不是该字符串的一部分。只有在使用
%{query\u string}
变量的
RewriteCond
中,才可能对查询字符串进行匹配,因为这样的条件可以根据某种模式测试任意字符串,而不仅仅是URL的路径组件。然后,在这样的条件中捕获的令牌可以被以下
重写规则中的
%1
引用,而
$1
引用该规则本身的捕获

详细信息在中进行了解释,在处理重写或重定向规则时,您应该始终参考这些信息。它写得很好,并且有很好的例子



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

那么“没有任何锁”实际上意味着什么?会发生什么?你看到了重定向吗?错了吗?它会崩溃吗?宇宙是否内爆?确保http服务器进程能够读取您的动态配置文件,确保已启用对此类文件的解释(
AllowOverride
指令),检查您是否已启用重写模块,并在
上使用
重写引擎,请确保该文件位于正确系统上的正确位置,并监视http服务器日志文件。还有一个一般提示:在99%的情况下,将此类重写规则放置在旧主机配置中而不是使用动态配置文件更有意义。它根本不重定向。我在同一系统中设置了其他重写规则工作正常的文件。谢谢,你能详细说明一下重写条件和重写规则是如何工作的吗?谢谢。现在这对我来说更有意义了。我已经阅读了一些文档,但感到困惑。最后一个问题,在您的示例中,为什么使用%1而不是%2来引用搜索字符串?使用您的示例,我得到了重定向,但它是不正确的。它正在重定向到:/index.php?route=product/search&search=search\u中的描述=1@StevenLutz我必须道歉,我再次修改了答案,修正了条件。
%1
是正确的,但要使其工作,必须将第一个括号集标记为“非捕获组”(
(?:…)
)。我后来添加了这个组,以便在查询字符串中获得更大的灵活性,但忘记了那个细节。我还修复了第二个捕获组,其中缺少了扬抑符(
^
)…非常感谢!这是有效的。我现在对这一切是如何运作的有了更好的理解,但是如果你不打算捕获它,我不明白为什么你创建了第一个团队。。换句话说,如果您不打算引用第一个组,为什么要将其放在()中?另外,为什么最后一组由[^\&]*组成,而不是只抓住所有东西(.*)?