PHP 将表单重定向到自定义 URL

PHP Redirect Form to Custom URL

我有一个用于重定向搜索结果页面的 .htaccess 代码。

RewriteRule ^search/([a-zA-Z0-9\-]+)$ search.php?query= [L,NC]

所以当你去 /search/blabla 时,你只需去 search.php?query=blabla

有效,没问题。当我写地址栏 /search/blabla 它显示结果。

问题是,当我使用我的搜索表单时,它会将我转到 search.php?query=blabla(不出意外)

这是我的表单代码:

<form id="search" name="search" action="search.php" method="get">
    <table>
        <tr>
            <td><input type="text" size="20" maxlength="100" name="query" id="query"></td>
            <td><input type="submit" value="Search"></td>
        </tr>
    </table>
</form>

我希望此表单将我重定向到 search/query 而不是 search.php?query=query

我该怎么做?

在您之前的规则之前插入此重定向规则:

RewriteCond %{THE_REQUEST} \s/+search\.php\?query=([^\s&]+) [NC]
RewriteRule ^ /search/%1? [R=302,L,NE]

我遇到了同样的问题,我最终做的是使用 JavaScript 拦截提交。

form.onsubmit = function(){
    var url = 'http://example.com/search/query';
    // obviously you will have some logic generating the url

    window.location = url;
    return false;
}

一点解释。

我认为不需要重写规则,因为这是 javascript 中非常基本的功能并且在所有浏览器中都受支持。您可能会遗漏的事实是,对每个请求都执行了重写规则,这意味着如果您有更多规则(您可能会这样做),则必须 运行 所有请求的所有正则表达式。这是毫无意义的,因为根据您的应用程序,大多数规则只占很少的请求,这意味着您在长 运行 中浪费处理能力,正则表达式是您应该除非别无选择,否则避免使用。我知道浪费可能很小,但是当您最终像这样进行许多微优化时,可能最终会变得很重要。

随便说说。