.htaccess jest ignorowany, mimo że VirtualHost ma „AllowOverride All”

25

Korzystam z serwera LAMP na Fedorze 13, który działa dobrze; Jednak właśnie dodałem plik „.htaccess” do folderu docroot mojej bieżącej witryny, który jest całkowicie ignorowany.

Wypróbowałem pół tuzina różnych testów, w tym ten:

RewriteEngine on
RewriteBase /

RewriteRule ^.*$ index.php

Ale obrazy i wszystkie inne strony ładują się dobrze, a nieistniejące pliki wciąż 404. Próbowałem także:

order deny,allow
deny from all

Ale każda strona wciąż ładuje się dobrze. Ponownie plik .htaccess jest po prostu ignorowany w 100%.

Umieszczamy nasze rekordy virtualhost w /etc/httpd/conf.d/virtual.conf. To wygląda tak:

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>

Co jeszcze może powodować, że nasz serwer całkowicie IGNORUJE .htaccessplik?

Edytować:

Zmieniłem plik .htaccess na powyższy, aby lepiej pokazać, że moje zmiany są ignorowane. Zauważ, że próbowałem dokładnie tego samego pliku .htaccess na serwerze produkcyjnym i działało dobrze.

Edycja 2:

OK, mam nowe informacje! Dla celów testowych przeszedłem i tymczasowo zmieniłem KAŻDĄ dyrektywę „AllowOverride” na AllowOverride All. Doszedłem do wniosku, że pierwszy wpis w katalogu wydaje się obezwładnić wszystkie pozostałe:

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

Kiedy zmieniłem to na AllowOverride All, moje pliki .htaccess zaczynają działać. To tak, jakby wszystkie inne AllowOverride Alldyrektywy w moich plikach konfiguracyjnych były ignorowane!

Co daje??

Brian Lacy
źródło

Odpowiedzi:

32

Nie do wiary. Pamiętasz, jak powiedziałem, że to serwer programistyczny? Tak ... oto jak wygląda mój wpis wirtualnego hosta NAPRAWDĘ:

<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>

Czy ty to widzisz? Cóż, nie zrobiłem tego. ZAPOMNIAŁEM Zmienić mój wpis „Katalog” na dev.ourwebsite.com zamiast ourwebsite.com - i to wszystko zrobiło różnicę. Po prostu założyłem, że Apache zgłosiłby błąd, gdyby katalog nie istniał; ale dotyczy to tylko dyrektywy DocumentRoot. jest oparty na dopasowaniu - co oznacza, że ​​stosuje reguły, jeśli pasuje do przychodzącego żądania, ale w przeciwnym razie nie ma znaczenia, czy powiesz to AllowOverride na magicznych jednorożcach.

Niech będzie to lekcja dla wszystkich innych, którzy przyjdą szukać - gdy wszystko inne zawiedzie, rozważ wszechmocną literówkę.

Brian Lacy
źródło
Nigdy przez milion lat tego nie złapałbym! Miałem też literówkę na ścieżce katalogu, także projekt deweloperski ... Dzięki za otwarcie oczu.
gillytech,
Ja też miałem literówkę w katalogu. To było naprawdę frustrujące. To było błogosławieństwo, że natknąłem się na to i dowiedziałem się, że mogę popełniać bardzo głupie błędy.
Akash Kumar Sharma
Wiem, że minęło 7 lat, ale chciałem tylko wpaść i powiedzieć, że ta odpowiedź pomogła mi. To był ten sam rodzaj rzeczy. Skopiowałem dyrektywy z innego wirtualnego hosta i zmieniłem zły bit. Dzięki za udostępnienie tych informacji! Mądrze surfuj.
dolst
5

Sprawdź, czy jakieś inne „AllowOverride None” przedstawione w „httpd.conf” powyżej deklaracji virtualhosts. Prawdopodobnie w docroot masz „AllowOverride None”.

Denis
źródło
Serwer, z którym pracuję, jest serwerem programistycznym i jest dokładną kopią naszego serwera produkcyjnego. Pliki httpd.conf są praktycznie identyczne. Jedyną znaczącą różnicą jest to, że nasz plik „virtual.conf” na tym serwerze ma mniej wpisów i każda strona ma prefiks dev.. Jednak serwer produkcyjny działa dobrze, pliki .htaccess zachowują się dokładnie zgodnie z oczekiwaniami, a serwer programistyczny po prostu całkowicie ignoruje plik .htaccess.
Brian Lacy
0

Trzy domysły:

Czy faktycznie jest przecinek po przecinku w linii order deny, alloww .htaccess? Apache tego nie lubi. Dla mnie na F13 dostałem 500s.

Czy masz AccessFileNamegdzieś dyrektywę?

Jeśli używasz selinux, czy masz poprawny kontekst dla pliku ( ls -lZ)?

Mark Wagner
źródło
Nie dostaję 500 błędów. Plik .htaccess jest po prostu ignorowany. I zweryfikowałem, że i tak nie mam tam miejsca. Nic nie wiem o selinux ani kontekstach, ale sprawdziłem, jak to sprawdzić i najwyraźniej jest wyłączone. Co do tego AccessFileName, rozejrzę się, ale jak powiedziałem w moim komentarzu do odpowiedzi Denisa, konfiguracja apache dla tych dwóch serwerów jest faktycznie identyczna.
Brian Lacy
Miałem też problemy z przestrzenią. Doprowadzało mnie to do szału.
egorgry
Ups, poprawka: W mojej httpd.conf mam dyrektywę AccessFileName. Brzmi on następująco:AccessFileName .htaccess
Brian Lacy
0

Miałem to na świeżym serwerze, w końcu zdałem sobie sprawę, że przepisywanie modów nie było domyślnie włączone.

ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
jmullee
źródło