Получить запрос не работает после изменения файла htaccess - PullRequest
0 голосов
/ 24 ноября 2018
RewriteEngine On

RewriteRule ^([a-zA-Z0-9]+)$ product-detail.php?asin=$1 [L,NC]
RewriteRule ^product product.php [L,NC]
RewriteRule ^product/page/([0-9]+)$ product.php?page=$1 [L,NC]

Почему .htaccess выше влияет на мой запрос GET?

if (isset($_GET['page'])) {
    $Product_page = $_GET['page'] ;
}
else {
    $Product_page = 1;
}

Я получаю страницы с использованием страницы, проанализированной по URL-адресу, например product.php?page=.Но когда я получаю доступ к GET-запросу после изменения URL-адреса на /product/page/6, он не получает вторую страницу.Первая страница работает, потому что по умолчанию 1.

1 Ответ

0 голосов
/ 26 ноября 2018
RewriteRule ^product product.php [L,NC]

Я удивлен, что это не приводит к циклу перезаписи?(Но это, возможно, зависит от остальной части вашей конфигурации. Например, у вас включено MultiViews?)

Это ловит любой запрос, который просто запускает /product и переписывает в/product.php.Таким образом, /product/page/6 переписывается на /product.php и номер страницы теряется.Кстати, запрос на /product также будет перехвачен первым RewriteRule, переписав запрос на product-detail.php?asin=product ?!Кроме того, если у вас включен MultiViews, это также может привести к конфликту.

Вместо этого вы можете сделать что-то вроде следующего:

Options -MutliViews

RewriteEngine On

RewriteRule ^([a-zA-Z0-9]+)$ product-detail.php?asin=$1 [L]
RewriteRule ^product(?:/page/([0-9]+))?$ product.php?page=$1 [L,NC]

Это объединяет оба правила и делает /page/<n>часть URL необязательна.Что приведет к перезаписи на product.php?page= - , см. Примечание ниже .

Вы уверены, что вам нужен флаг NC на втором RewriteRule?Это потенциально создает «дублированный контекст», если у вас нет канонических тегов.(Я удалил его в первый раз, поскольку вы уже проверяете прописные / строчные буквы непосредственно в регулярном выражении.)

if (isset($_GET['page'])) {
    $Product_page = $_GET['page'] ;
}
else {
    $Product_page = 1;
}

Вы, похоже, доверяете значению page URL-параметр.Как отмечалось выше, это может быть законно пустым, поэтому по умолчанию следует 1 для любого недопустимого значения , а не только тогда, когда оно вообще отсутствует.

...