для новичков: пытаясь всесторонне описать мою проблему и сформулировать мои вопросы, я произвела огромное количество текста. Если вы не Я не хочу читать все это, мои наблюдения о (читай "доказательство") неверное представление, из которого все это возникло, находится в Дополнительные наблюдения раздел. Почему я неправильно понял кажущееся поведение, описано в моем Ответе, а также решение данной проблемы. [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), но на этом переписывание не заканчивается. Есть еще идеи, пожалуйста?