Почему эти правила 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> 
Другие вопросы по тегам