.htaccess игнорируется, хотя VirtualHost имеет «AllowOverride All»

25

Я использую сервер LAMP на Fedora 13, который работает нормально; тем не менее, я просто добавил файл .htaccess в папку docroot моего текущего сайта, который полностью игнорируется.

Я пробовал полдюжины разных тестов, включая этот:

RewriteEngine on
RewriteBase /

RewriteRule ^.*$ index.php

Но изображения и все другие страницы загружаются нормально, а несуществующие файлы по-прежнему 404. Я также попробовал это:

order deny,allow
deny from all

Но каждая страница по-прежнему загружается просто отлично. Снова .htaccess файл просто игнорируется на 100%.

Мы помещаем наши записи виртуального хоста в /etc/httpd/conf.d/virtual.conf. Это выглядит так:

NameVirtualHost *

<VirtualHost *>
    ServerName              intranet
    DocumentRoot            /var/www/default
    <Directory "/var/www/default">
        Options FollowSymLinks
        AllowOverride All

        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *>
    ServerName              ourwebsite.com
    DocumentRoot            /var/www/html/ourwebsite.com/docroot
    <Directory "/var/www/html/ourwebsite.com/docroot">
        Options FollowSymLinks
        AllowOverride All

        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Что еще может быть причиной того, что наш сервер полностью игнорирует .htaccessфайл ??

Редактировать:

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

Изменить 2:

ОК, у меня есть новая информация! Просто для целей тестирования я прошел и временно изменил КАЖДУЮ директиву AllowOverride AllowOverride All. Я понял, что самая первая запись Справочника, кажется, подавляет все остальные:

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

Когда я изменил это на AllowOverride All, мои .htaccess файлы начинают действовать. Как будто все остальные AllowOverride Allдирективы в моих конфигурационных файлах игнорируются!

Что дает??

Брайан Лейси
источник

Ответы:

32

Невероятно. Помните, как я сказал, что это сервер разработки? Да ... ну вот как ДЕЙСТВИТЕЛЬНО выглядит моя запись виртуального хоста:

<VirtualHost *>
    ServerName              dev.ourwebsite.com
    DocumentRoot            /var/www/html/dev.ourwebsite.com/docroot
    <Directory "/var/www/html/ourwebsite.com/docroot">
        Options FollowSymLinks
        AllowOverride All

        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Вы видите это? Ну, я не сделал. Я забыл изменить свою запись «Каталог» на dev.ourwebsite.com вместо ourwebsite.com - и это имело все значение. Я просто предположил, что Apache выкинул бы ошибку, если бы каталог не существовал; но это относится только к директиве DocumentRoot. основан на совпадении - это означает, что он применяет правила, если он соответствует входящему запросу, но в противном случае, ему все равно, если вы скажете это AllowOverride на магических единорогах.

Пусть это станет уроком для всех, кто придет посмотреть - когда все остальное не поможет, подумайте о всемогущей опечатке.

Брайан Лейси
источник
Я никогда бы за миллион лет не поймал этого! У меня также была опечатка в пути к каталогу, также проект разработчика ... Спасибо, что открыли мне глаза.
Gillytech
У меня тоже была опечатка в директории. На самом деле, это было так сложно. Это было благословение, что я столкнулся с этим и узнал о том, что я могу делать супер глупые ошибки.
Акаш Кумар Шарма
Я знаю, что прошло 7 лет, но я просто хотел заглянуть и сказать, что этот ответ только помог мне. Это было то же самое. Я скопировал директивы с другого виртуального хоста и изменил неправильный бит. Спасибо, что поделились этой информацией! Посмотри мудро.
dolst
5

Проверьте, присутствует ли какой-либо другой «AllowOverride None», представленный в «httpd.conf» над объявлением virtualhosts. Возможно, у вас есть «AllowOverride None» в docroot.

Денис
источник
Сервер, с которым я работаю, является сервером разработки и является точной копией нашего производственного сервера. Файлы httpd.conf практически идентичны. ЕДИНСТВЕННОЕ существенное отличие состоит в том, что наш «virtual.conf» на этом сервере имеет меньше записей, и каждый сайт имеет префикс dev.. Тем не менее, рабочий сервер работает нормально, файлы .htaccess ведут себя точно так, как ожидается, и сервер разработки просто полностью игнорирует файл .htaccess.
Брайан Лейси
0

Три догадки:

Есть ли на самом деле пробел после запятой в строке order deny, allowв .htaccess? Апачу это не нравится. Для меня на F13 я получил 500.

У вас есть AccessFileNameгде-нибудь директива?

Если вы используете selinux, у вас есть правильный контекст для файла ( ls -lZ)?

Марк Вагнер
источник
Я не получаю 500 ошибок. Файл .htaccess просто игнорируется. И я убедился, что у меня там нет места в любом случае. Я ничего не знаю о selinux или контекстах, но я посмотрел, как проверить, и, видимо, он отключен. Что касается AccessFileName, я посмотрю вокруг, но, как я сказал в своем комментарии к ответу Дениса, конфигурация apache для этих двух серверов фактически идентична.
Брайан Лейси
У меня также были проблемы с пространством. Это сводило меня с ума.
egorgry
Ой, исправление: у меня есть директива AccessFileName в моем httpd.conf. Это гласит следующее:AccessFileName .htaccess
Брайан Лейси
0

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

ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
jmullee
источник