在这种情况下,我建议从index.php重定向而不是使用重写规则。重写规则也有成本,每次页面加载时都会检查它们
在index.php的开头:
<?php
if(!empty($_GET["search"]))
{
header("Location: search?q=".rawurlencode($_GET["search"]));
exit;
}
?>
正如Olaf Dietsche在评论中正确指出的那样,mod_rewrite 优于 PHP,所以问题实际上是 index.php 与其他文件的命中率。如果它很低,php 方法肯定更好,但是,如果 index.php 达到 50% 左右的时间,那么重写可能会更好。
因此,还要添加 mod_rewrite 解决方案:
RewriteEngine on
RewriteCond %{QUERY_STRING} (?:^|&)search=([^&]+)
RewriteRule ^index.php$ /search?q=%1 [R,L]
RewriteCond
实际上查找search=
查询字符串参数并确保它不为空并且该规则只是将 index.php 中的任何内容重写为/search?q=<query>
注意%1
用于匹配从条件匹配的第一个捕获的子模式(而不是从规则本身的匹配部分 - 在在这种情况下我们需要使用$1
)。
然而,真正的问题是为什么我们首先要处理这个问题。如果搜索是通过在页面中提交一个值来完成的,那么它就是表单提交,因此它可以直接指向处理程序,之后不会重定向到那里。这效率更高。
<form action="/search" method="get">
<input type="text" name="q">
...
这样,从搜索表单提交的任何内容都将直接转到/search
并且不需要重定向来处理。