现在,在表单提交时,URL看起来像:
(其中'query'是提交的数据)
http://mySite.com/index.php?search=query
或
http://mySite.com/?search=query
我怎样才能成功
http://mySite.com/search?q=query
如果可以在不编辑.htaccess文件的情况下执行此操作,请告诉我如何操作。
或者如果有必要编辑.htaccess,请告诉我要添加的规则,以便所有查询在提交时都有该表单中的网址。
答案 0 :(得分:1)
我建议从 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
,无需重定向即可处理。
答案 1 :(得分:1)
添加mod_rewrite解决方案。您必须检查index.php
和search=
查询字符串
RewriteCond %{QUERY_STRING} search=(.*)
RewriteRule ^index\.php$ /search?q=%1 [R,L]