Как получить флаг [L] для RewriteRule (.htaccess) на самом деле работаешь?

для новичков: пытаясь всесторонне описать мою проблему и сформулировать мои вопросы, я произвела огромное количество текста. Если вы не Я не хочу читать все это, мои наблюдения о (читай "доказательство") [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 , и часть GUI JavaScript, расположенную в foo / web . Как видно из приведенного выше кода, я хочу разрешить доступ только к одноядерному сценарию, который обрабатывает все запросы из графического интерфейса пользователя и «защищает» веб-файлы и перенаправляет все остальные запросы на базовый адрес приложения (последняя прокомментированная директива).


Задача


Поведение

Работает, пока я не попробую последнюю часть, раскомментировав последнюю директиву перенаправления. Если я прокомментирую еще несколько строк, соответствующие части страницы перестанут работать и т. Д.

Однако, когда я раскомментирую последнюю строку, который должен выполняться только в случае сбоя сопоставления всех предыдущих правил (по крайней мере, я так понимаю), страница переходит в цикл перенаправления (Firefox выдает страницу с ошибкой, например, «Эта страница перенаправляет неправильно»), потому что она перенаправляет на http: // localhost / foo / снова и снова и снова, навсегда.

Вопросы

Чего я не понимаю, так это обработки этого правила:

RewriteRule ^ $ web / index .html [L] ,

, в частности, флаг [L] . Флаг явно не работает для меня. Когда последняя строка комментируется, она правильно перенаправляет, но когда я раскомментирую ее, она всегда обрабатывается, даже если перезапись должна останавливаться на флаге [L]. У кого-нибудь есть идеи?

Кроме того, по поводу Я был бы рад узнать, почему моя следующая попытка исправить это тоже не работает:

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), но на этом переписывание не заканчивается. Есть еще идеи, пожалуйста?

5
задан hon2a 4 September 2010 в 12:42
поделиться