Использование переменной $ _GET для функции поиска с правилами .htaccess переписывает переменную URL - PullRequest
0 голосов
/ 06 июня 2018

У меня проблемы с поиском нескольких слов на моем сайте.

Моя функция поиска использует переменную $_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]

Это прекрасно работает при поиске по одному слову (например, «поиск» или «термин»)но не при поиске нескольких слов (например, «критерий поиска»).

Когда я делаю это, я получаю сообщение об ошибке 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]

Любая помощь или помощь с этим будет принята с благодарностью.

/ ---------- 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 голосов
/ 06 июня 2018

Чтобы запретить поисковому запросу совпадать со вторым показанным вами RewriteRule, попробуйте поставить следующую строку перед ним:

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

Это будет эффективно игнорировать путь / search при обработке этого правила.

Обратите внимание: если после этого конфликта у вас появилось больше правил, вы можете вместо этого переместить поисковый RewriteRule в файл выше.

Кроме того, ваше регулярное выражение для соответствия поисковому запросу должно также содержать пробелы.,Попробуйте это:

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

(обратите внимание на \s, добавленный к классу символов)

Просмотр теста .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...