代码之家  ›  专栏  ›  技术社区  ›  Paddy Hallihan

对搜索函数使用$get变量,并使用.htaccess规则重写url变量

  •  1
  • Paddy Hallihan  · 技术社区  · 6 年前

    我在我的网站上搜索多个单词时遇到问题。

    我的搜索函数使用 $_GET 搜索变量如下:

    $term = $_GET['search'];
    $newterm = '%'.$term.'%';
    
    $params = [$newterm];
    $sql = "SELECT * FROM products WHERE product_name LIKE ?";
    $stmt = DB::run($sql,$params);
    

    我还有一句台词 .htaccess 从如下内容重写URL的文件 search.php?search=search%20term search/search%20term 像这样:

    RewriteRule ^search/([0-9a-zA-Z-]+)/?$ search.php?search=$1 [L,NC,QSA]
    

    当搜索一个单词(例如“search”或“term”)时,这种方法很有效,但当搜索多个单词(例如“search term”)时,这种方法就不起作用。

    当我这样做时,我得到一个404错误,说明:

    The requested URL example.com/search/search term.php was not found on this server.
    

    然而,url确实显示了 %20 在地址栏而不是空格中 .php 分机,就像这样:

    example.com/search/search%20term
    

    它似乎认为这是另一个目录/文件,而不是url中的变量,这可能是由于 HTAccess 文件:

    RewriteRule ^([^\.]+)$ $1.php [L,NC,QSA]
    

    我们非常感谢您的帮助和帮助。

    /—————————————————————————————————-\

    我的全部 HTAccess 文件:

    Options -MultiViews
    RewriteEngine on
    
    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    
    RewriteRule ^category/([0-9a-zA-Z-]+)/?$ category.php?id=$1 [L,NC,QSA]
    RewriteRule ^product/([0-9a-zA-Z-]+)/?$ product.php?id=$1 [L,NC,QSA]
    RewriteRule ^product/([0-9a-zA-Z-]+)/added?$ product.php?id=$1&added=added [L,NC,QSA]
    RewriteRule ^page/([0-9a-zA-Z-]+)/?$ page.php?page_id=$1 [L,NC,QSA]
    RewriteRule ^order/([0-9a-zA-Z-]+)/?$ order.php?id=$1 [L,NC,QSA]
    RewriteRule ^search/([0-9a-zA-Z-]+)/?$ search.php?search=$1 [L,NC,QSA]
    
    RewriteCond %{REQUEST_URI} ^/search/.*$ [NC]
    RewriteRule ^([^\.]+)$ $1.php [L,NC,QSA]
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   LeonardChallis    6 年前

    若要阻止搜索词与显示的第二个重写规则匹配,请尝试将此行放在它之前:

    RewriteCond %{REQUEST_URI} !^/search/.*$ [NC]
    

    在处理该规则时,这将有效地忽略/search路径。

    注意,如果在此冲突之后有更多规则,则可能需要将搜索重写规则移到文件的更高位置。

    此外,要匹配搜索词的regex还需要允许空格。试试这个:

    RewriteRule ^search/([0-9a-zA-Z\s-]+)/?$ search.php?search=$1 [L,NC,QSA]
    

    (注意 \s 添加到字符类)

    View the test .