1

现在,提交表单后,URL 如下所示:

(其中“查询”是提交的数据)

http://mySite.com/index.php?search=query

或者

http://mySite.com/?search=query

我怎样才能做到

http://mySite.com/search?q=query

如果可以在不编辑 .htaccess 文件的情况下执行此操作,请告诉我如何操作。

或者如果需要编辑 .htaccess,请教我添加什么规则,以便所有查询在提交时都具有该表单中的 URL。

4

2 回答 2

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并且不需要重定向来处理。

于 2013-04-17T06:09:13.813 回答
1

添加一个 mod_rewrite 解决方案。您必须检查index.phpsearch=查询字符串

RewriteCond %{QUERY_STRING} search=(.*)
RewriteRule ^index\.php$ /search?q=%1 [R,L]
于 2013-04-17T15:55:32.593 回答