Назад | Перейти на главную страницу

Несколько RewriteRule в htaccess не работают

Я прекрасно понимаю, что вопросы такого типа уже задавали много раз, но я думаю, что мой вопрос другой. Я новичок в .htaccess.

RewriteEngine On 
RewriteBase /

RewriteCond %{HTTP_HOST} ^localhost/index.php
RewriteRule (.*) localhost/index.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] 

# RewriteRule . /index.php [L]
# RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [QSA,L]
# RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

Когда я запускаю свой код RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L], это нормально работает. Но когда я пытаюсь запустить второе правило RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L], это не работает. Здесь ошибки не отображаются, а URL-адрес браузера Chrome отображается как http://localhost/bagsgentssel1/45.

Интересно то, что если я прокомментирую код ниже, то второй RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] работает отлично.

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

Я не могу найти, где я ошибся?

У вас неправильный порядок указаний. Вам нужно больше конкретный директивы в первую очередь.

RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

Ваше первое правило ловит все (с рисунком ^(.*)$), поэтому ваше второе правило никогда не выполняется. Вам нужно либо сделать вышеуказанное RewriteRule шаблон более конкретным (например, совпадать только числами или что-то в этом роде), чтобы это не противоречило второму правилу. Или поменяйте местами ваши два правила, чтобы сначала было второе (более конкретное) правило:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

Интересно то, что если я прокомментирую код ниже, то второй RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] работает отлично.

Собственно, вы удаляете директиву, которая конфликтует / улавливает все.

Директивы mod_rewrite обрабатываются сверху вниз. Если директива в верхней части файла перехватывает запрос, все последующие директивы могут быть пропущены.

Если у вас нет других директив, то приведенное выше можно переписать:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^bagsgentssel1/([0-9]+)$ bagsgentssel1.php?h=$1 [L] 

RewriteRule ^(.*)$ leather-product.php?n=$1 [QSA,L]

В стороне:

RewriteCond %{HTTP_HOST} ^localhost/index.php
RewriteRule (.*) localhost/index.php [R=301,L]

Я не уверен, что он должен делать, но на самом деле он ничего не делает ( состояние никогда не совпадет). Хотя если бы это было так, похоже, перерыв.