使用$ _GET变量进行搜索功能,使用.htaccess规则重写URL变量

时间:2018-06-06 11:49:10

标签: php .htaccess get

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

我的搜索功能使用$_GET变量进行搜索,如下所示:

$term = $_GET['search'];
$newterm = '%'.$term.'%';

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

我的.htaccess文件中还有一行,用于将网址从search.php?search=search%20term重写为search/search%20term,如下所示:

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

搜索一个单词(例如'搜索'或' term')时效果很好,但搜索多个单词时却不行(例如'搜索字词')

当我这样做时,我收到404错误说明:

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

但是,该网址确实会在地址栏中显示%20而不是空格而不会显示.php扩展名,如下所示:

example.com/search/search%20term

似乎认为这是另一个目录/文件,而不是URL中的变量,这可能是由.htaccess文件中的这一行引起的:

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

对此有任何帮助或帮助将不胜感激。

/ ---------- ---------- EDIT \

我的完整.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 个答案:

答案 0 :(得分:1)

要停止搜索字词与您显示的第二个RewriteRule匹配,请尝试将此行放在其前面:

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

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

请注意,如果此冲突后有更多规则,您可能希望将搜索RewriteRule更高地移到文件中。

此外,匹配搜索词的正则表达式也需要允许空格。试试这个:

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

(注意添加到角色类的\s

View the test