Субдомены с htaccess не работают должным образом - PullRequest
0 голосов
/ 12 марта 2012

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

Со следующей структурой папок в качестве корня для domain.local и board.domain.local

/
 app/
 bin/
 board/
     index.php
 src/
 vendor/
 web/
     index.php

А это .htaccess в папке /

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^board.domain.local$
    RewriteRule ^(.*)$ board/$1 [QSA,L]
    RewriteCond %{HTTP_HOST} ^domain.local$
    RewriteRule ^(.*)$ web/$1 [QSA,L]
</IfModule>

Я получаю внутреннюю ошибку сервера при доступе к board.domain.local. Доступ к domain.local отлично работает и перенаправляет запросы на web/.

Почему первая перезапись не работает?

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Вы делаете переписывание относительного пути в контексте для каталога без RewriteBase.Почему один работает, а другой нет, из-за некоторого компенсирующего фактора в другом месте, который несовместим между board и web.Внутренняя ошибка сервера, скорее всего, петля.Проверьте журнал ошибок.

RewriteEngine On
RewriteBase /   # need this sucker
RewriteCond %{HTTP_HOST} ^board.domain.local$
RewriteRule ^(.*)$ board/$1 [QSA,L]
RewriteCond %{HTTP_HOST} ^domain.local$
RewriteRule ^(.*)$ web/$1 [QSA,L]

В контексте каждого каталога перезаписи выполняются на пути к файловой системе, а не на URL.Перезапись выполняется только на части пути после каталога, который удаляется.Если вы делаете относительную перезапись, часть каталога возвращается после.И затем происходит идиотская вещь: переписывание обрабатывается как URL!RewriteBase указывает префикс, который нужно переписать (вместо наивного восстановления префикса пути), чтобы сделать его действительным URL-адресом.RewriteBase говорит: «хотя мы работаем с каталогом /var/www/docroot, он фактически представляет пространство URL /, поэтому, когда URL повторно генерируются из перезаписей, они должны находиться в этом пространстве, а не в /var/www/docroot, который не являетсяURL ".

Задайте себе вопрос: что такое DocRoot?И так, что будут URL-адреса из относительного переписывания, когда DocRoot (неправильно) прикреплен как префикс из-за пропущенного RewriteBase?Проследите обработку этих поддельных URL-адресов через вашу конфигурацию, и вы непременно обнаружите причину, по которой один попадает в бесконечный цикл, а другой - нет.

0 голосов
/ 13 марта 2012

Это действительно дополнение к комментарию Каз, так как я с ними согласен, но оно не вписывается в ограничение количества символов комментария. Если файл .htaccess обрабатывается (в контексте на каталог), если произошла одна или несколько перезаписей, которые изменяют URI, то происходит внутреннее перенаправление. Сканирование .htaccess перезапускается, и правила оцениваются.

По умолчанию используется только один набор правил перезаписи: это те, которые находятся в самом низком .htaccess на пути с RewriteEngine On. Таким образом, в случае domain.local запроса на втором проходе и , если DOCROOT/web/.htaccess, тогда он будет выполнен вместо DOCROOT/.htaccess для запросов к domain.local.

Другим аспектом является проблема зацикливания, которая, как я вижу, связана с перезаписью второй секунды для каждого правила. Однако это может не сработать, если у вас включены такие опции, как MultiViews (еще одна причудливая недоработка Apache, которая наносит ущерб правилам перезаписи), потому что это разбивает запрос на части и выполняет подзапросы, которые могут помешать этому типу антирекурсивного условия.

Так что я всегда включаю MultiViews и DirectoryIndex со списком поиска.

Вы также можете добавить флаг [NS] ко всем правилам, поскольку ни одно из них не применимо в подзапросе. Я также установил переменную окружения END = true для принудительного выхода, когда я хочу сделать это и использую этот ограничитель в верхней части моих правил:

 RewriteCond  %{IS_SUBREQ}%{ENV:END} true
 RewriteRule  ^                      -    [L]
0 голосов
/ 12 марта 2012

Попробуйте добавить еще несколько условий, чтобы двигатель перезаписи не зацикливался (ваш URI в конечном итоге станет / board / board / board / board / board / board / board / board / etc.)

RewriteEngine On

RewriteCond %{HTTP_HOST} ^board.domain.local$
RewriteCond %{REQUEST_URI} !^/board
RewriteRule ^(.*)$ board/$1 [QSA,L]

RewriteCond %{HTTP_HOST} ^domain.local$
RewriteCond %{REQUEST_URI} !^/web
RewriteRule ^(.*)$ web/$1 [QSA,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...