проблемы с mod_rewrite - PullRequest
       4

проблемы с mod_rewrite

1 голос
/ 18 сентября 2011

Я пытаюсь переписать запросы для файлов, которые существуют, независимо от их расширения, в общедоступном каталоге в этот каталог, а все остальное - в контроллер.Если пользователь переходит к http://example.com/images/foo.gif, и он существует, изображение должно быть подано из% {DOCUMENT_ROOT} /public/images/foo.gif.Если они переходят на http://example.com/foo/bar, и его не существует, то запрос должен быть перенаправлен через index.php.У меня есть два блока, которые работают отдельно, но не вместе.Когда оба помещаются в .htaccess, какой бы ни был первый в .htaccess, он прекрасно работает, а тот, что внизу, полностью игнорируется (при попытке проверить это выдает страницу 404).Может кто-нибудь объяснить мне, что я делаю не так?

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f
RewriteRule ^.*$ - [L]
RewriteRule ^.*$ index.php [L]

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} !-f
RewriteRule ^.*$ - [L]
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/public/$1 [L]

1 Ответ

0 голосов
/ 26 октября 2011

Похоже, что несколько вещей не так.

Похоже, что ваши 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:

  1. % {DOCUMENT_ROOT} / public // foo / bar не существует, условие! -F выполнено
  2. foo / bar переписывается в index.php, с [L], конец перезаписывается
  3. Запрос ВНУТРЕННЕГО перенаправлен на index.php
  4. С новым URI (index.php) все правила повторно применяются
  5. % {DOCUMENT_ROOT} /public/index.php существует, условие! -F не ​​выполнено
  6. % {DOCUMENT_ROOT} /public/index.php существует, -f условие выполнено
  7. index.php переписывается в% {DOCUMENT_ROOT} /public/index.php
  8. ВНУТРЕННЕЕ перенаправление, и все правила повторно применяются к новому URI (/public/index.php)
  9. % {DOCUMENT_ROOT} /public//public/index.php не существует, условие! -F выполнено
  10. public / index.php переписывается в index.php
  11. вернуться к 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...