Для новичков: пытаясь всесторонне описать мою проблему и сформулировать мои вопросы, я произвел огромное количество текста. Если вы не хотите читать все это, мои наблюдения о (читай "доказательство") [L]
флаг не работает неправильное представление, из которого все это возникло, находится в Дополнительно наблюдения раздел. Почему я неправильно понял кажущееся поведение, описано в моем ответе, а также решение данной проблемы.
Настройка
<Ч />
В моем файле .htaccess есть следующий код:
# disallow directory indexing
Options -Indexes
# turn mod_rewrite on
Options +FollowSymlinks
RewriteEngine on
# allow access to robots file
RewriteRule ^robots.txt$ robots.txt [NC,L]
# mangle core request handler address
RewriteRule ^core/(\?.+)?$ core/handleCoreRequest.php$1 [NC,L]
# mangle web file adresses (move them to application root folder)
# application root folder serves as application GUI address
RewriteRule ^$ web/index.html [L]
# allow access to images
RewriteRule ^(images/.+\.(ico|png|bmp|jpg|gif))$ web/$1 [NC,L]
# allow access to stylesheets
RewriteRule ^(css/.+\.css)$ web/$1 [NC,L]
# allow access to javascript
RewriteRule ^(js/.+\.js)$ web/$1 [NC,L]
# allow access to library scripts, styles and images
RewriteRule ^(lib/js/.+\.js)$ web/$1 [NC,L]
RewriteRule ^(lib/css/.+\.css)$ web/$1 [NC,L]
RewriteRule ^(lib/(.+/)?images/.+\.(ico|png|bmp|jpg|gif))$ web/$1 [NC,L]
# redirect all other requests to application address
# RewriteRule ^(.*)$ /foo/ [R]
Мое веб-приложение (и его файл .htaccess) находится в подпапке foo
в DOCUMENT_ROOT
(доступ из браузера осуществляется как http://localhost/foo/
). Он содержит основную часть PHP, расположенную в foo/core
, и часть JavaScript, которая находится в foo/web
. Как видно из приведенного выше кода, я хочу разрешить доступ только к одноядерному сценарию, который обрабатывает все запросы из графического интерфейса пользователя и «защищает» веб-файлы и перенаправляет все остальные запросы на базовый адрес приложения (последняя прокомментированная директива).
Задача
<Ч />
Поведение
Это работает, пока я не попробую последнюю часть, раскомментировав последнюю директиву перенаправления. Если я прокомментирую еще несколько строк, соответствующие части страницы перестанут работать и т. Д.
Однако, когда я раскомментирую последнюю строку, которая должна выполняться только в случае сбоя сопоставления всех предыдущих правил (по крайней мере, это я так понимаю), страница переходит в цикл перенаправления (Firefox выдает страницу ошибки с чем-то вроде «Эта страница не является» t перенаправить правильно "), потому что он перенаправляет на http://localhost/foo/
снова и снова и снова, навсегда.
Вопросы
Что я не понимаю, так это обработка этого правила:
RewriteRule ^$ web/index.html [L]
в частности флаг [L]
. Флаг, очевидно, не работает для меня. Когда последняя строка комментируется, она правильно перенаправляет, но когда я раскомментирую ее, она всегда обрабатывается, даже если перезапись должна останавливаться на флаге [L]. У кого-нибудь есть идеи?
Кроме того, на sidenote, я был бы рад узнать, почему моя следующая попытка исправить это тоже не работает:
RewriteEngine on
RewriteRule ^core/(\?.+)?$ core/handleCoreRequest.php$1 [NC,L]
RewriteRule ^(.*)$ web/$1 [L]
RewriteRule ^.*$ /foo/ [L]
На самом деле это вообще не работает. Даже если я удаляю последнюю строку, она все равно ничего не перенаправляет правильно. Как работает перенаправление в первом примере, если оно не работает во втором?
Мне также было бы очень полезно, если бы кто-нибудь знал, как на самом деле отладить эти директивы. Я трачу на это часы, даже не зная, что может быть не так.
Дополнительные наблюдения
<Ч />
После того, как попробовал совет, данный bbadour (не то, чтобы я не пробовал его раньше, но теперь, когда у меня было второе мнение, я дал ему еще один шанс), и он не сработал, я придумал Следующее наблюдение. Переписав последнюю строку к этому:
RewriteRule ^(.*)$ /foo/?uri=$1 [R,L]
или это
RewriteRule ^(.*)$ /foo/?uri=%{REQUEST_URI} [R,L]
и используя панель Net Firebug, я обнаружил больше доказательств того, что флаг [L] явно не работает, как ожидалось в ранее упомянутом правиле RewriteRule ^$ web/index.html [L]
(давайте теперь будем называть его ПРАВИЛОМ). В первом случае я получаю [...]uri=web/index.html
, во втором [...]uri=/foo/web/index.html
. Это означает, что выполняется ПРАВИЛО (переписывает ^ $ в web / index.html), но переписывание на этом не заканчивается. Есть еще идеи, пожалуйста?