У меня есть виртуальный хост, работающий на моей локальной копии 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-адрес мог быть разрешен.