Ваши правила приведут к перезаписи l oop, поскольку второе правило будет соответствовать переписанному URL-пути, ie. index.php
.
Вы можете просто добавить исключение, которое предшествует существующим перезаписям:
RewriteRule ^index\.php$ - [L]
Если запрос соответствует /index.php
(что он делает после первой перезаписи), затем прекратить обработку .
И / ИЛИ, сделайте свое регулярное выражение более строгим (что будет рекомендовано в любом случае). Например, вместо сопоставления чего-либо, ie. .+
, соответствует только символам слова, например. \w+
. (Совпадения a-z
, A-Z
, 0-9
и _
). и др c. Или сопоставьте что-нибудь, кроме sla sh или точка, например. [^/.]+
. Тогда вам не нужно будет делать подшаблоны не жадными (во избежание совпадения с дополнительным конечным sla sh).
ОБНОВЛЕНИЕ: Если вы обслуживаете другие данные c ресурсы, тогда вам может потребоваться выполнить проверку файловой системы, чтобы убедиться, что перезаписываемый запрос еще не сопоставлен с файлом (или каталогом). Это обычная практика, однако, она относительно дорогая (с точки зрения обработки), и ее часто можно избежать, сделав регулярное выражение более ограничительным - как упомянуто выше.
Например:
RewriteEngine On
# Ignore (rewritten) requests for index.php
RewriteRule ^index\.php$ - [L]
# Ignore requests that map to files or directories
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# Rewrite pretty URLs
RewriteRule ^(\w+)/(\w+)/?$ index.php?a=$1&b=$2 [QSA,L]
RewriteRule ^(\w+)/?$ index.php?a=$1 [QSA,L]
RewriteRule ^/?$ index.php [NC,L]
Обратите внимание, что если вам нужно принимать дефисы (-
) как часть сегмента пути URL, то измените \w
на [\w-]
- чтобы добавить дефисы в класс символов.