Задать вопрос
inilim2
@inilim2
Intern PHP

Где ошибка в правиле api?

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI} ^api/ [NC]
    RewriteRule ^api/ index.php [L]

    # Все остальные запросы → index.html (игнорируя существующие файлы)
    RewriteRule ^ index.html [L]
</IfModule>


не отрабатывает пути к api
  • Вопрос задан
  • 53 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dodo512
Как на самом деле работает 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]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы