Назад | Перейти на главную страницу

Виртуальный хост Apache с псевдонимом

У меня есть виртуальный хост, работающий на моей локальной копии Apache. У него есть псевдоним.

<VirtualHost 127.0.0.1>
        ServerName oliverash.me.dev
        DocumentRoot "/usr/docs/oliverash.me/public"
        Alias /mayor "/usr/docs/uni/tmosct/public"
</VirtualHost>

Это прекрасно работает. Я могу получить доступ к псевдониму, перейдя в oliverash.me.dev/mayor в моем браузере. Однако у меня есть простой .htaccess rewrite в папке этого псевдонима, которая перезаписывает все (кроме папок) на страницу index.php. Эта перезапись работает нормально.

Хотя перезапись работает, перезапись возвращается с ошибкой 404 Not Found. Например, если я пойду в oliverash.me.dev/mayor/abcdefg, который переписывается в index.php файл, но я получаю эту ошибку:

«Запрошенный URL /usr/docs/uni/tmosct/public/index.php не был найден на этом сервере».

Этот файл действительно существует. Я могу получить к нему доступ напрямую.

Когда я использую тот же псевдоним, но для localhost вместо этого виртуального хоста перезапись работает нормально, и index.php возвращается с фактическим файлом, а не с 404. Это заставляет меня думать, что это как-то связано с разрешениями моего виртуального хоста. Поэтому я попытался добавить это под своим httpd-vhosts.conf (не повезло):

<Directory "/usr/docs/oliverash.me/public">
        AllowOverride All
        Order allow,deny
        Allow from all
</Directory>

Это те же настройки, которые используются на localhostс DocumentRoot, поэтому я не понимаю, почему это не помогает.

ОБНОВИТЬ:

Итак, я проверил Apache error_log. Оказывается, перезаписи для этого псевдонима на самом деле относятся к корню документа этого виртуального хоста.

[Fri Jan 06 22:30:57 2012] [error] [client 127.0.0.1] File does not exist: /usr/docs/oliverash.me.dev/usr

Эта перезапись фактически просматривается /usr/docs/oliverash.me.dev/public/usr/docs/uni/tmosct/public для index.php. Надеюсь, очевидно, что он должен искать /usr/docs/oliverash.me.dev.

ОБНОВЛЕНИЕ 2:

Хорошо, это проблема у меня локальная копия Apache. Однако я только что столкнулся с той же проблемой для псевдонима на моем действующем веб-сервере. Здесь не используется какой-либо виртуальный хост.

[Sat Jan 07 02:41:51 2012] [error] [client 86.11.223.135] File does not exist: /var/www/html/var

Опять же, путь указан относительно DocumentRoot. Это должен быть абсолютный путь.

Немного раздражает :(

ОБНОВЛЕНИЕ 3:

Это как раз та проблема, с которой я столкнулся, но, возможно, сформулирована лучше: http://forums.devshed.com/apache-development-15/rewritebase-alias-and-rewriterule-are-not-rooting-to-required-file-395917.html

Решение: RewriteBase должен быть таким же, как определение псевдонима, а не физический путь / каталог в файловой системе!

Проверить RewriteBase директива для mod_rewrite, похоже, это может быть связано с этим. Об этом читайте здесь: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

Редактировать 1:
Чтобы попробовать это, я установил чистый свежий Ubuntu в VMware, чистую установку apache2 и создал новую папку вне обычного пути, затем установил .htaccess, и я заставил его работать с правильным RewriteBase правило. DocumentRoot по умолчанию - / var / www, я помещаю туда index.php, чтобы показать мне, где я нахожусь. Он повторяет: «По умолчанию я - index.php!». Затем я создал этот псевдоним в конфигурации Apache:

Alias /testberg /home/www/testberg
<Directory "/home/www/testberg">
    Options +Indexes
    AllowOverride All
</Directory>

И туда я помещаю еще один index.php, говоря: «Я index.php in testberg!». В / home / www / testberg я создал .htaccess со следующим содержимым:

RewriteEngine On
RewriteBase /testberg
RewriteRule ^apa.test$ index.php

Когда я просматриваю http://192.168.100.183/testberg/apa.test Теперь я вижу: "Я - index.php в testberg!" и никаких ошибок в файле журнала Apache и т. д.

Разве это не то, чего вы хотели достичь?

Редактировать 2:
Пробуем с другим виртуальным хостом. На рабочем столе Windows я указал ahntest.net на свой IP-адрес VMware в c:\windows\system32\drivers\etc\hosts. На моем сервере VMware я создал /home/www/ahntest.net и поместите туда измененный index.php, чтобы повторить "Я index.php in ahntest.net!" и создал следующий виртуальный хост:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName ahntest.net
    DocumentRoot /home/www/ahntest.net

    Alias /testberg /home/www/testberg
    <Directory "/home/www/testberg">
        Options +Indexes
        AllowOverride All
    </Directory>
</VirtualHost>

Сидя в http://ahntest.net дает мне "Я index.php в ahntest.net!", просматривая http://ahntest.net/testberg дает мне "Я - index.php в testberg!" и, наконец, просматриваю http://ahntest.net/testberg/apa.test дает мне "Я - index.php в testberg!" так что здесь он тоже отлично работает, насколько я могу судить. .Htaccess / patch в Edit 2 такой же, как и в Edit 1 выше.

Что вам нужно, так это контейнер каталога для цели псевдонима

<Directory "/usr/docs/uni/tmosct/public">
  ...
</Directory>

ОБНОВИТЬ

Вы должны поместить контейнер каталога внутри контейнера VirtualHost, чтобы они работали на виртуальном хосте.

ОБНОВЛЕНИЕ 2

Быстро проверив jsFiddle, вам понадобится

NameVirtualHost *:80

над контейнером, а затем вы должны переписать

<VirtualHost 127.0.0.1>

в

<VirtualHost *:80>

и, наконец, что не менее важно, вам нужна запись в вашем файле hosts, чтобы URL-адрес мог быть разрешен.