Похоже, что несколько вещей не так.
Похоже, что ваши RewriteCond назад. Если %{DOCUMENT_ROOT}/public/%{REQUEST_URI}
не не существует (! -F), то вы хотите переписать в index.php, но если он существует (-f), то переписать в / public / $ 1. Во-вторых, RewriteRule ^.*$ - [L]
фактически запрещает применение фактического правила, потому что оно заканчивается на [L] , и это останавливает перезапись в текущей итерации.
Даже если вы удалите перезаписи ^.*$ - [L]
и перевернете -f
и !-f
, вы столкнетесь с проблемой со 2-й итерацией перезаписи:
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} !-f
RewriteRule ^.*$ index.php [L]
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/public/$1 [L]
Вот что происходит, когда вы пытаетесь получить доступ к http://example.com/foo/bar:
- % {DOCUMENT_ROOT} / public // foo / bar не существует, условие! -F выполнено
- foo / bar переписывается в index.php, с [L], конец перезаписывается
- Запрос ВНУТРЕННЕГО перенаправлен на index.php
- С новым URI (index.php) все правила повторно применяются
- % {DOCUMENT_ROOT} /public/index.php существует, условие! -F не выполнено
- % {DOCUMENT_ROOT} /public/index.php существует, -f условие выполнено
- index.php переписывается в% {DOCUMENT_ROOT} /public/index.php
- ВНУТРЕННЕЕ перенаправление, и все правила повторно применяются к новому URI (/public/index.php)
- % {DOCUMENT_ROOT} /public//public/index.php не существует, условие! -F выполнено
- public / index.php переписывается в index.php
- вернуться к 3. внутренней петле
Нечто подобное происходит, когда вы пытаетесь получить доступ к http://example.com/images/foo.gif, по сути, вам нужно получить другое правило, чтобы остановить переписывание во второй раз. Поэтому вам нужно добавить 2-й набор условий:
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} !-f
RewriteRule ^.*$ index.php [L]
RewriteCond %{REQUEST_URI} !/index.php
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/public/$1 [L]