.htaccess nie działa apache


135

Mam serwer z usługi AWS EC2 działający na Linuksie ubuntu i zainstalowałem apache, php i mysql.

Dodałem .htaccessplik w katalogu głównym dokumentów /var/www/html.

Wpisałem w nim ten kod: ErrorDocument 404 /var/www/html/404.phpi nadal się nie wyświetla.

Wielokrotnie wprowadzałem to polecenie: sudo service httpd restartaby zrestartować serwer, ale żadne zmiany nie zostały wyświetlone ...

Jak mogę to naprawić ... Czy zrobiłem coś nie tak?

Z góry dziękuję!


2
Czy na pewno chcesz zamapować 400 Bad Requestbłąd na /var/www/html/404.php?
Jon Lin

Odpowiedzi:


288

Po pierwsze, należy pamiętać, że ponowne uruchomienie httpd nie jest konieczne w przypadku plików .htaccess. Pliki .htaccess są przeznaczone specjalnie dla osób, które nie mają uprawnień administratora - tj. nie mają dostępu do pliku konfiguracyjnego serwera httpd i nie mogą go ponownie uruchomić. Ponieważ możesz zrestartować serwer, nie potrzebujesz plików .htaccess i możesz bezpośrednio korzystać z konfiguracji serwera głównego.

Po drugie, jeśli pliki .htaccess są ignorowane, musisz sprawdzić, czy AllowOverride jest ustawione poprawnie. Szczegółowe informacje można znaleźć pod adresem http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride . Musisz również upewnić się, że jest ustawiony we właściwym zakresie - tj. We właściwym bloku w twojej konfiguracji. Na przykład upewnij się, że NIE edytujesz tego w bloku.

Po trzecie, jeśli chcesz mieć pewność, że plik .htaccess jest faktycznie odczytywany, umieść w nim śmieci. Nieprawidłowa linia, na przykład „INVALID LINE HERE” w pliku .htaccess, spowoduje błąd 500 Server Error, gdy wskażesz przeglądarkę katalog zawierający ten plik. Jeśli tak się nie stanie, oznacza to, że nie masz poprawnie skonfigurowanego AllowOverride.


141
+1 za umieszczanie śmieci w pliku .htaccess jako narzędzia diagnostycznego.
retrohacker

46
Śmieci w programowaniu są bardziej przydatne niż się wydaje.
EnKrypt

1
Wrzuciłem "A STRING" mój .htaccess, więc otrzymałem błąd, więc umieściłem AllowOverride Allwszystko apache2.confw moim Debianie i działa
Alex

1
Zauważ, że AllowOverridedziała tylko w <Directory>dyrektywach i zostanie zignorowany, jeśli zostanie umieszczony w <Location ...>sekcji, zobacz: httpd.apache.org/docs/2.4/mod/core.html#allowoverride
Daniel Sokolowski

2
Należy również zauważyć, że <Directory>dyrektywa oczekuje ścieżki bezwzględnej zamiast względnej. W moim przypadku <Directory /> nie udało się podczas <Directory /var/www/html/subdir>pracy.
Lukas Knuth

115
  1. Włącz moduł mod_rewrite Apache

    a2enmod rewrite

  2. dodaj następujący kod do /etc/apache2/sites-available/default

    AllowOverride All

  3. Zrestartuj Apache

    /etc/init.d/apache2 restart


7
zwróć uwagę, że w Apache 2.4 pliki konfiguracyjne w / etc / apache2 / sites-available muszą teraz kończyć się na .conf. Miałem trochę pomyłki na moim serwerze z default.conf w / etc / apache2 / sites-available i jednym w / etc / apache2 /
rubo77

2
Dzięki, w moim przypadku przepisywanie nie było domyślnie włączone w apache2
Cross

już wykonuję te kroki, ale nie działa w Apache 2.4 co robię źle = [
Luciano Andress Martini

Wygląda na to, że wymagają zastąpienia adresu IP wymagają uwierzytelnienia, to zachowanie jest nieoczekiwane (nie rób tego z niektórych adresów IP w Apache 2.2 nie rób tego) i moim zdaniem może być bardzo niebezpieczne, ponieważ wyjątki IP anulują uwierzytelnianie, w Apache 2.2 są to zupełnie inne rzeczy !
Luciano Andress Martini

Pominąłem pierwszy krok, ale zmieniłem AllowOverride na All w moim apache.conf (Debian 8, /etc/apache2/apache.conf), zrestartowałem i pliki nie są dostępne, dobrze. Ale ten błąd nie jest taki, jak odmowa pozwolenia, ale błąd wewnętrzny serwera 500, dlaczego tak jest? Czy mogę to naprawić?
dasLort

44

Jeśli wypróbowałeś wszystkie powyższe, z których wszystkie są poprawnymi i dobrymi odpowiedziami, a Twój plik htaccess nie działa lub nie jest odczytywany, zmień dyrektywę w apache2.confpliku. W Ubuntu ścieżka to/etc/apache2/apache2.conf

Zmień <Directory>dyrektywę wskazującą na Twoje publiczne strony internetowe, na których znajduje się plik htaccess. Zmień z AllowOverride NonenaAllowOverride All

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Miałem ten sam problem i znalazłem odpowiedź i wyjaśnienie w Ubuntu Ask! forum /ubuntu/421233/eniring-htaccess-file-to-rewrite-path-not-working


2
Lub można go dodać na VHost
ssi-anik

Właściwie tylko AllowOverride FileInfow trzeciej linii jest wymagane .htaccessdo odczytu i użycia pliku. Allumożliwia również dodatkowe nadpisania konfiguracji, takie jak .httpasswd(które można włączać indywidualnie, używając Authconfigzamiast All).
Rafal

20

W przypadku Ubuntu
najpierw uruchom to polecenie: -

sudo a2enmod rewrite

Następnie edytuj plik /etc/apache2/sites-available/000-default.confza pomocą nano lub vim za pomocą tego polecenia: -

sudo nano /etc/apache2/sites-available/000-default.conf

Następnie w 000-default.confpliku dodaj to po wierszu DocumentRoot /var/www/html. Jeśli twój główny katalog html jest inny, napisz, że: -

<Directory "/var/www/html">
  AllowOverride All
</Directory>

Po wykonaniu wszystkiego uruchom ponownie Apache za pomocą polecenia sudo service apache2 restart


6

Po prostu wykonaj 3 kroki

  1. Włącz mode_rewrite za pomocą następującego polecenia

    sudo a2enmod przepisać

Zostaniesz poproszony o hasło. Więc wprowadź swoje hasło

  1. Zaktualizuj swój plik 000-default.conf lub default.conf znajdujący się w katalogu / etc / apache2 / sites-available / . nie możesz go edytować bezpośrednio. więc użyj następującego polecenia, aby otworzyć

    sudo gedit /etc/apache2/sites-available/000-default.conf

Lub sudo gedit /etc/apache2/sites-available/default.conf

dostaniesz

DocumentRoot / var / www / html

LUB

DocumentRoot / var / www

linia. Dodaj następujący kod po nim.

<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Ustaw użytkownika, aby ścieżka do znacznika katalogu była taka sama, jak w pliku.

  1. Zrestartuj serwer Apache za pomocą następującego polecenia

    restart usługi sudo apache2


Dzięki. Pozdrowienia z Brazylii.
Fox.

5

Najprawdopodobniej AllowOverride jest ustawiona na None. w sekcji Directory apache2.conf znajdującej się w folderze / etc / apache2

Spróbuj ustawić je na AllowOverride All


5

Z mojego doświadczenia wynika, że ​​/ var / www / directory dyrektywa zapobiega dyrektywom virtualhost podfolderów. Więc jeśli wypróbowałeś wszystkie sugestie i nadal nie działa i używasz virtualhostów, spróbuj tego;

1 - Upewnij się, że masz AllowOverride Alldyrektywę w /etc/apache2/sites-available/example.com.conf

2 - Sprawdź dyrektywy / var / www / Directory w /etc/apache2/apache2.conf(prawdopodobnie w linii 164), który wygląda tak;

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

Jeśli jest AllowOverride Nonedyrektywa, zmień ją na AllowOverride All linię ucieczki lub po prostu


3

Domyślnie Apache zabrania używania pliku .htaccess do stosowania reguł przepisywania, więc

Krok 1 - Włączanie mod_rewrite (jeśli nie jest włączone) Najpierw musimy aktywować mod_rewrite. Jest dostępny, ale nie jest włączony przy czystej instalacji Apache 2.

$ sudo a2enmod rewrite

Spowoduje to aktywację modułu lub ostrzeżenie, że moduł jest już włączony. Aby wprowadzić te zmiany, uruchom ponownie Apache.

$ sudo systemctl restart apache2

mod_rewrite jest teraz w pełni włączony. W następnym kroku utworzymy plik .htaccess, którego użyjemy do zdefiniowania reguł przepisywania dla przekierowań.

Krok 2 - Konfiguracja .htaccess Otwórz domyślny plik konfiguracyjny Apache za pomocą nano lub ulubionego edytora tekstu.

$ sudo nano /etc/apache2/sites-available/000-default.conf

Wewnątrz tego pliku znajdziesz blok rozpoczynający się w pierwszej linii. Wewnątrz tego bloku dodaj następujący nowy blok, aby plik konfiguracyjny wyglądał następująco. Upewnij się, że wszystkie bloki są odpowiednio wcięte.

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    . . . 
</VirtualHost>

Zapisz i zamknij plik. Aby wprowadzić te zmiany, uruchom ponownie Apache.

$ sudo systemctl restart apache2

Gotowe. Twoja .htacess powinna działać. Ten link może faktycznie pomóc komuś https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04


Polecenie restartu, które zadziałało dla mnie to $ sudo httpd -k restart(Red Hat 4.4.7-23)
Himalaya Garg

3

Usunąłem to użycie. Korzystając z tej witryny kliknij tutaj , postępuj zgodnie z instrukcjami, te same kroki co do wersji Ubuntu 18.04


1

W WampServerikonie Open WampServer Tray ----> Apache ---> Apache Modules ---> rewrite_module



0

Dla kompletności, jeśli „AllowOverride All” nie rozwiąże problemu, możesz go zdebugować za pomocą:

  1. Uruchom apachectl -Si sprawdź, czy masz więcej niż jeden host nazw. Możliwe, że httpd szuka .htaccess innego DocumentRoot.

  2. Użyj strace -f apachectl -Xi poszukaj, skąd się ładuje (lub nie ładuje) .htaccess z.

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.