Как на самом деле работает mod_rewrite.
%{REQUEST_URI} тут путь всегда начинается с
/
т.е. нужен шаблон
^/api/
А вот для RewriteRule есть разница в контексте .htaccess и
<VirtualHost>
.
В .htaccess RewriteRule получает путь который никогда не начинается / т.е. нужен шаблон
^api/
.
В
<VirtualHost>
RewriteRule получает весь путь т.е. нужен шаблон
^/api/
.
В контексте .htaccess mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться. И флаг [L] не может это остановить.
После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.
После срабатывания
RewriteRule ^api/ index.php [L]
запрос изменится на /index.php.
Обработка начнётся заново и сработает
RewriteRule ^ index.html [L]
запрос изменится на /index.html.
Нужно добавить исключение для /index.php.
RewriteEngine On
RewriteRule ^api/ index.php [L]
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^ index.html [L]
Или проверять переменную окружения %{ENV:REDIRECT_STATUS}.
Там сохраняется статус с которым завершилось предыдущее внутреннее перенаправление.
При первом проходе там пусто.
RewriteEngine On
RewriteRule ^api/ index.php [L]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^ index.html [L]
В Apache 2.4 доступен флаг
[END] который останавливает дальнейшую обработку правил mod_rewrite.
RewriteEngine On
RewriteRule ^api/ index.php [END]
RewriteRule ^ index.html [L]