2013-09-12 3 views
2

Я использую vhost_alias для выполнения mass virtual hosting и имею несколько сайтов, использующих mod_rewrite для управления их передними контроллерами.массовый виртуальный хостинг и правила перезаписи, вызывающие рекурсивное внутреннее перенаправление

Я не думаю, что это особая проблема symfony, но я использую symfony.

Теперь большинство запросов, которые соответствуют любому переписывает правило, в конечном итоге в infnite перенаправлять цикл, который вызывает ошибку HTTP 500.

Я проверил лог-файлы и это то, что я нашел:

(3) [perdir /home/user/www/mysite/] strip per-dir prefix: /home/user/www/mysite/app_dev.php -> app_dev.php 
(3) [perdir /home/user/www/mysite/] applying pattern '^$' to uri 'app_dev.php' 
(3) [perdir /home/user/www/mysite/] strip per-dir prefix: /home/user/www/mysite/app_dev.php -> app_dev.php 
(3) [perdir /home/user/www/mysite/] applying pattern '^(.*)$' to uri 'app_dev.php' 
(2) [perdir /home/user/www/mysite/] rewrite 'app_dev.php' -> 'web/app_dev.php' 
(3) [perdir /home/user/www/mysite/] add per-dir prefix: web/app_dev.php -> /home/user/www/mysite/web/app_dev.php 
(1) [perdir /home/user/www/mysite/] internal redirect with /home/user/www/mysite/web/app_dev.php [INTERNAL REDIRECT] 
(3) [perdir /home/user/www/mysite/] add path info postfix: /home/user/www/mysite/home -> /home/user/www/mysite/home/user/www/mysite/web/app_dev.php 
(3) [perdir /home/user/www/mysite/] strip per-dir prefix: /home/user/www/mysite/home/user/www/mysite/web/app_dev.php -> home/user/www/mysite/web/app_dev.php 
(3) [perdir /home/user/www/mysite/] applying pattern '^$' to uri 'home/user/www/mysite/web/app_dev.php' 

Как вы можете видеть, что после внутренней строки перенаправления абсолютный путь становится частью согласованного URI, этот uri, конечно, не соответствует никаким файлам и обрабатывается снова как совершенно новый uri, это приводит к новому абсолютному пути, добавленному на URI. Этот процесс повторяется до достижения установленного предела.

Я попытался это без конфигурации виртуальных хостов (который работает отлично) и заметил, что перед внутренним перенаправлением есть новая линия:

(2) [perdir /home/user/www/mysite/] strip document_root prefix: /home/user/www/mysite/web/app_dev.php -> /web/app_dev.php 
(1) [perdir /home/user/www/mysite/] internal redirect with /web/app_dev.php [INTERNAL REDIRECT] 

После этого перенаправлять фактический файл сопоставляются и нет никаких проблем ,

Не следует ли лишить виртуальный документ_и_у в виртуальной конфигурации, а также в обычной конфигурации?

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

Не хватает ли какой-либо опции конфигурации?

Вот мой файл .htaccess:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteRule ^$ web/ [QSA,L]  
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ web/$1 [QSA,L] 
</IfModule> 

Вот мой Apache конфигурационный файл:

Ниже декларации VirtualDocumentRoot существуют некоторые закомментирована правила перезаписи.

Это была попытка заменить VirtualDocumentRoot на правила перезаписи, но у него была аналогичная проблема: в strip_wow был указан/home/user/www, оставляя имя хоста частью URL-адреса, поэтому я получаю такая же рекурсивная проблема.

Так что я хотел бы знать, если кто-то когда-либо делал mod_vhost_alias работу с mod_rewrite. Я действительно пытался искать везде (даже Google!), Но не мог найти много информации об этом.

+0

ли файл '/ главная/пользователя/WWW/MySite/веб/app_dev.php' существует? –

+0

Да, все есть. Это клон репозитория, который довольно хорошо работает везде где-то еще (в Интернете и других машинах, где я не использую массовый виртуальный хостинг) – Jens

ответ

2

Целью правила перезаписи (2-й параметр) может быть либо путь к файлу, либо URL-путь. Когда неясно, что это такое, mod_rewrite догадывается, и похоже, что он может предположить, что это путь к файлу.Несколько вещей, которые вы можете попробовать:

  1. Добавить переписывания базу или сделать цель на абсолютный URL-путь, добавив ведущую /
  2. Добавить дополнительное условие, чтобы проверить, если URI начинается с /web/
  3. Maybe добавить еще одно условие, чтобы проверить, если цель существует

для 1 и 2:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteRule ^$ /web/ [QSA,L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !^/web/ 
    RewriteRule ^(.*)$ /web/$1 [QSA,L] 
</IfModule> 

возможно 3:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteRule ^$ /web/ [QSA,L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{DOCUMENT_ROOT}/web%{REQUEST_URI} -f [OR] 
    RewriteCond %{DOCUMENT_ROOT}/web%{REQUEST_URI} -d 
    RewriteRule ^(.*)$ /web/$1 [QSA,L] 
</IfModule> 
+0

RewriteBase сделал это, я просто добавил «RewriteBase /» ко всем моим htaccess и теперь нет рекурсии «filepath as url», потому что перед каждой перенаправлением префикс каталога заменяется на все, что я накладываю на RewriteBase, поэтому сгенерированный URL-адрес является правильным URL-адресом. Я все еще удивляюсь, почему DocumentRoot становится полосатым в обычных конфигурациях, но VirtualDocumentRoot этого не делает. Мне кажется, что это багги. Что касается дополнительного условия, он бы остановил цикл, но не предотвратил бы внутренние переадресации от создания плохих URL-адресов, которые не совпадали бы. – Jens

0

Чтобы включить его модуль перезаписи, запустить "apache2 включить модуль переписывания":

sudo a2enmod rewrite 

Вам необходимо перезапустить сервер, чтобы применить изменения:

sudo service apache2 restart 

VirtualHost должен быть таким: Имя_сервера localhost.myproject.dev ServerAdmin web мастер @ локальный

DocumentRoot /var/www/project_path 
<Directory /var/www/project_path> 
    Options Indexes FollowSymLinks MultiViews 
    AllowOverride None 
    Order allow,deny 
    allow from all 
    <IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteRule ^(.*)$ /app.php [QSA,L] 
    </IfModule> 
</Directory>