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