我在搜索网站上的多个字词时遇到问题。
我的搜索功能使用$_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]
答案 0 :(得分:1)
要停止搜索字词与您显示的第二个RewriteRule匹配,请尝试将此行放在其前面:
RewriteCond %{REQUEST_URI} !^/search/.*$ [NC]
在处理该规则时,这将有效地忽略/搜索路径。
请注意,如果此冲突后有更多规则,您可能希望将搜索RewriteRule更高地移到文件中。
此外,匹配搜索词的正则表达式也需要允许空格。试试这个:
RewriteRule ^search/([0-9a-zA-Z\s-]+)/?$ search.php?search=$1 [L,NC,QSA]
(注意添加到角色类的\s
)