Я прекрасно понимаю, что вопросы такого типа уже задавали много раз, но я думаю, что мой вопрос другой. Я новичок в .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]
Я не уверен, что он должен делать, но на самом деле он ничего не делает ( состояние никогда не совпадет). Хотя если бы это было так, похоже, перерыв.