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

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


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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.