Почему эти правила mod_rewrite не работают?
У меня есть .htaccess
файл, который выглядит следующим образом:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)/(\d+?)/?$ index.php?cmd=$1&num=$2 [L]
RewriteRule ^(.+?)/?$ index.php?cmd=$1 [L]
</IfModule>
По сути, я пытаюсь написать API, который может обрабатывать такие запросы, как get_all/
или же get/123/
,
Проблема в том, что когда я пытаюсь перейти на любой из указанных выше URL, cmd
параметр всегда установлен в index.php
и num
параметр не установлен вообще.
Если я закомментирую любой из RewriteRule
строки, затем запросы работают для оставшегося, закомментированного RewriteRule, но мне нужно уметь обрабатывать оба случая.
Я знаю о цикле, который происходит с mod_rewrite
, но в этом случае я понятия не имею, как это остановить. Я даже не могу понять, почему вышеуказанные правила вызывают cmd
быть установленным на index.php
,
Может кто-нибудь объяснить, пожалуйста, что здесь происходит и как это исправить?
Спасибо.
1 ответ
Правила ведут себя потому, что RewriteCond
применяется только к самому следующему RewriteRule
, Благодаря этому ваш последний RewriteRule
работает без условий и, следовательно, работает дважды mod_rewrite
петля.
Используйте этот код, чтобы исправить это:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)/(\d+?)/?$ index.php?cmd=$1&num=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)/?$ index.php?cmd=$1 [L]
</IfModule>
Если вы хотите избежать повторения Rewriteond
затем используйте:
<IfModule mod_rewrite.c>
RewriteEngine On
# skips files and directories from rewrite rules
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^(.+?)/(\d+?)/?$ index.php?cmd=$1&num=$2 [L]
RewriteRule ^(.+?)/?$ index.php?cmd=$1 [L]
</IfModule>