Jak włączyć mod_rewrite dla Apache 2.2

474

Mam nową instalację Apache 2.2 na moim komputerze z systemem Vista, wszystko działa dobrze, z wyjątkiem mod przepisywania.

Nie skomentowałem

LoadModule rewrite_module modules/mod_rewrite.s

ale żadna z moich reguł przepisywania nie działa, nawet prosta

RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404

Wszystkie zasady, których używam, działają na moim hostingu, więc powinny być w porządku, więc moje pytanie brzmi: czy jest jakaś ukryta rzecz w konfiguracji apache, która mogłaby blokować przepisywanie modów?

Jakub Arnold
źródło
1
tak naprawdę problem polegał na tym, że miałem niewłaściwą ścieżkę, ponieważ $ {DOCUMENT_ROOT} wskazał mi katalog główny, który był w porządku na hostingu, ale na lokalnym, więc problemem nie było po prostu RewriteEngine On, które już miałem ...
Jakub Arnold
Czy możesz zmienić zaakceptowaną odpowiedź na to pytanie ? Autor obecnie przyjętej odpowiedzi przyznał, że nie jest wystarczająco dobra.
Shadow Wizard is Ear For You
1
Jak włączyć mod_rewrite w Ubuntu 12.04 LTS (powinien działać również w Debianie) . To pokazuje instalację ORAZ aktywację, poniższe tutoriale nieoczekiwanie tego nie robią :(
Sliq
3
Zdecydowanie radzę wszystkim, którzy chcą włączyć dyrektywy mod_rewrite w plikach .htacces AllowOverride FileInfozamiast zezwalać na wszystko, jak sugerują WSZYSTKIE odpowiedzi na tej stronie. Smutne, że wszystkie te odpowiedzi przyjmują podejście tak długo, jak to działa, jest w porządku, zamiast próbować zrozumieć konsekwencje proponowanego „rozwiązania”. Postaraj się zrozumieć, co robisz na serwerze i jak ograniczyć uprawnienia, które właśnie przekazałeś AllowOverride All. RTFM! , jest dość jasne na ten temat.
RemyNL,
1
@Black Jest w pliku konfiguracyjnym Apache o nazwie httpd.conf. Na moim komputerze znajduje się w katalogu C: \ xampp \ apache \ conf, ponieważ zainstalowałem Apache z XAMPP.
Lex Soft

Odpowiedzi:

1005

Aby użyć mod_rewrite, możesz wpisać następujące polecenie w terminalu:

sudo a2enmod rewrite

Uruchom ponownie apache2 po

sudo /etc/init.d/apache2 restart

lub

sudo service apache2 restart

lub zgodnie z nowym ujednoliconym sposobem sterowania systemem

sudo systemctl restart apache2

Następnie, jeśli chcesz, możesz użyć następującego .htaccesspliku.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

Powyższy .htaccessplik (jeśli zostanie umieszczony w Twoim pliku DocumentRoot) przekieruje cały ruch do index.phppliku w pliku, DocumentRootchyba że plik istnieje.

Załóżmy, że masz następującą strukturę katalogów, a httpdocs to DocumentRoot

httpdocs/
    .htaccess
    index.php
    images/
        hello.png
    js/
        jquery.js
    css/
        style.css
includes/
    app/
        app.php

Każdy plik, który istnieje w httpdocs, zostanie dostarczony do requestera przy użyciu .htaccesspowyższego, jednak wszystko inne zostanie przekierowane httpdocs/index.php. Twoje pliki aplikacji w includes/appnie będą dostępne.

Jonathan Mayhak
źródło
15
Pomysły tutaj są poprawne dla CLI UNIX, ale polecenia działają tylko dla dystrybucji Linuksa opartych na Debianie, a nie dla środowiska Windows OP.
Jason Rikard
17
a2enmod przepisał to zadanie
Dr Casper Black
98
Dodatkowa uwaga: musisz również upewnić się, że konfiguracja witryny ma AllowOverride All, .htaccessaby w ogóle plik został odczytany.
Adam Rosenfield
2
@ Dennis można użyć przepisania a2dismod
Jonathan Mayhak
3
jak mogę używać a2enmod rewritew systemie Windows?
Naman
229

W mojej sytuacji miałem

RewriteEngine On

w moim .htaccess, wraz z ładowanym modułem i nie działał.

Rozwiązaniem mojego problemu była edycja mojego wpisu vhost na inlcude

AllowOverride all

w <Directory>sekcji dotyczącej danej witryny.

Mike Wazowski
źródło
10
Rzeczywiście, nawet z a2enmod rewrite& RewriteEngine Onw .htaccess- istnienie AllowOverride allpliku VirtualHost uniemożliwi mu działanie - to mnie przyłapało, zmieniając go tak, by AllowOverride alldziałał jak urok :)
HeavenCore
9
początkujący tutaj .. gdzie jest plik VirtualHost?
Davidne
3
TO jest droga do wyjścia ... Miałem wszystko inne oprócz tego.
tablica
2
AllowOverrideDyrektywa określa „Typy dyrektyw, które są dozwolone w .htaccessplikach”. Ponadto „Gdy ta dyrektywa jest ustawiona None, .htaccesspliki są całkowicie ignorowane. W takim przypadku serwer nawet nie będzie próbował odczytać .htaccessplików w systemie plików”. Oficjalne dokumenty: httpd.apache.org/docs/2.2/mod/core.html#allowoverride
John Erck
To naprawiło to dla mnie - miałem problem z ładnymi permalinkami WordPress, które nie działały poprawnie. Jeśli to zrobisz, a2enmod rewritea następnie w pliku VirtualHosts zmień opcję „AllowOverride None” na „AllowOverride All”, powinno to działać. Plik VirtualHosts ma zastosowanie, jeśli korzystasz z wielu nazw domen na tym samym serwerze (i adresie IP). Musiałbyś to skonfigurować, aby skonfigurować domenę.
Jason Preston
83

Spróbuj ustawić: AllowOverride All.


Drugim najczęstszym problemem jest brak włączonego przepisywania modów: a2enmod rewritea następnie restart Apache.

Jarrod
źródło
To powinna być odpowiedź nr 1, ponieważ rozwiązuje problem występujący w domyślnej instalacji ubuntu!
Sliq,
1
Umożliwi to .htaccess zastąpienie dowolnej innej konfiguracji apache. Nie jest to zalecane.
Bhargav Nanekalva
Tak :) to też był mój problem, ale oto miejsce, które wyjaśniasz początkującym, takim jak ja, że ​​ten „AllowOverride All” znajduje się w /etc/apache2/sites-available/[sitename].conf and [sitename-ssl] .conf Przez ciebie musiałem przeprowadzić drugie badanie: D, tak przy okazji!
MetaTron
77

Jeśli żadna z powyższych czynności nie działa, spróbuj edytować / etc / apache2 / sites-enabled / 000-default

prawie na górze znajdziesz

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Zmień AllowOverride NonenaAllowOverride All

to zadziałało dla mnie

Martin Sax
źródło
Zmieniono błąd z /laravel/public/authors was not found on this serverna/index.php was not found on this server
Gangaraju,
nie mogę znaleźć <Katalog>, tylko <VirtualHost *: 80>
Nicolas S.Xu
1
@ NicolasS.Xu umieść to w znaczniku <VirtualHost *: 80>
wimdetr,
Zrobiłem to samo, ale dodałem nową sekcję, <Directory /var/www/html>aby zastosować regułę z tego folderu i tylko w górę.
Louis Loudog Trottier
44

W Ubuntu:

Biegać:

a2enmod rewrite

i wtedy:

service apache2 restart

mod_rewrite będzie teraz włączony!

nickleefly
źródło
28

Istnieje wiele sposobów rozwiązania tego problemu, jeśli znasz jego przyczynę.

Problem 1

Po pierwsze, może być problem z tym, że twój apache nie ma zainstalowanego lub włączonego modułu mod_rewrite.c.

Z tego powodu należy włączyć go w następujący sposób

  1. Otwórz konsolę i wpisz:

    sudo a2enmod rewrite

  2. Uruchom ponownie serwer Apache.

    service apache2 restart

Problem 2

  1. Oprócz powyższego możesz również, jeśli to nie zadziała, zmienić regułę nadpisywania z pliku conf apache (albo apache2.conf, http.conf, albo domyślny plik 000).

  2. Znajdź „Katalog / var / www /”

  3. Zmień „Zastąp brak” na „Zastąp wszystko”

Problem 3

Jeśli pojawi się błąd informujący, że moduł przepisywania nie został znaleziony, prawdopodobnie moduł userdir nie jest włączony. Z tego powodu musisz go włączyć.

  1. Wpisz to w konsoli:

    sudo a2enmod userdir

  2. Następnie spróbuj włączyć moduł przepisywania, jeśli nadal nie jest włączony (jak wspomniano powyżej).

Aby przeczytać więcej na ten temat, możesz odwiedzić tę stronę: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html

Kripa Jayakumar
źródło
2
Świetny podział problemu.
Banago,
Nie używaj, AllowOverride Allponieważ spowoduje to włączenie zbyt wielu funkcji niebezpiecznych (takich jak używanie skryptów Perla). Zamiast tego użyjAllowOveride Options
Marki555
28

Nowa wersja Apache w jakiś sposób się zmieniła. Jeśli twoja wersja apache to 2.4, musisz przejść do /etc/apache2/. Będzie plik o nazwie apache2.conf. Musisz go edytować (powinieneś mieć uprawnienia roota). Zmień tekst katalogu w ten sposób

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

Teraz uruchom ponownie apache.

service apache2 reload

Mam nadzieję, że to działa.

Ijas Ahamed N.
źródło
To jest aktualna odpowiedź.
paulc
1
Jeśli jesteś w 2019 roku i później, poproś o odpowiedź na tę odpowiedź :)
Luiz Cavalcanti
27

Otwórz terminal i wpisz a2enmod rewrite, To pozwoli włączyć mod_rewritemoduł dla Apache.

Następnie przejdź do /etc/apache2/sites-availablepliku domyślnego i edytuj go. (W tym celu musisz mieć uprawnienia do zapisu do tego pliku i folderu dostępnego na stronach).

Zastąp poniżej istniejącymi wierszami od 4 do 14

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

Teraz uruchom ponownie apache za pomocą /etc/init.d/apache2 restartlubservice apache2 restart

Ponownie wykonaj test czystego adresu URL i tym razem zostanie on zaliczony.

Umesh Patil
źródło
15

<edycja>

Właśnie zauważyłem, że powiedziałeś mod_rewrite.s zamiast mod_rewrite.so - mam nadzieję, że to literówka w twoim pytaniu, a nie w pliku httpd.conf! :)

</edit>

Jestem bardziej przyzwyczajony do używania Apache w Linuksie, ale musiałem to zrobić innego dnia.

Najpierw zajrzyj do katalogu instalacyjnego Apache. (Zakładam, że zainstalowałeś go tutaj w „C: \ Program Files”)

Zajrzyj do folderu: „C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ modules” i upewnij się, że jest tam plik o nazwie mod_rewrite.so. (Powinno być, jest on dostarczany jako część domyślnej instalacji.

Następnie otwórz „C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ conf” i otwórz httpd.conf. Upewnij się, że linia:

#LoadModule rewrite_module modules/mod_rewrite.so

jest niezakomentowany:

LoadModule rewrite_module modules/mod_rewrite.so

Ponadto, jeśli chcesz domyślnie włączyć RewriteEngine, możesz chcieć dodać coś takiego

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

na końcu pliku httpd.conf.

Jeśli nie, upewnij się, że podałeś

RewriteEngine On

gdzieś w pliku .htaccess.

Danny Battison
źródło
@ gabehabe twój awatar po prostu wyglądał tak, jakby trzymał ikonę mojego dokumentu, lol
Jonathan dos Santos
5

Właśnie to zrobiłem

sudo a2enmod rewrite

następnie musisz ponownie uruchomić usługę Apache, wykonując polecenie

sudo service apache2 restart
użytkownik3470929
źródło
4

Stary wątek, po prostu chcę umieścić, że nie ustawiam AllowOverride na wszystkie, zamiast tego użyj konkretnego modu, którego chcesz użyć,

AllowOverride mod_rewrite mod_mime

I tego wiersza nie należy komentować

LoadModule rewrite_module modules/mod_rewrite.so

Refrences

Abhishek Gurjar
źródło
4

Użyj poniższego polecenia

sudo a2enmod rewrite

I uruchom ponownie apache poprzez poniższe polecenie

sudo service apache2 restart
prasoon
źródło
3

Jest oczywiście więcej niż jeden sposób, ale sugerowałbym użycie bardziej standardowego:

ErrorDocument 404 /index.php?page=404
Michael Cramer
źródło
3

Gdy po raz pierwszy zmagałem się z zasadami mod_rewrite ignorującymi mój ruch, dowiedziałem się (frustrująco), że źle je umieściłem <VirtualHost>, co oznaczało, że mój ruch zignorowałby je wszystkie, bez względu na to, jak dobrze były napisane. Upewnij się, że tak się nie dzieje:

# Change the log location to suit your system. RewriteLog /var/log/apache-rw.log RewriteLogLevel 2

Te parametry zostaną aktywowane, jeśli wykonasz płynne ponowne uruchomienie Apache, abyś mógł je ponownie przetworzyć i ściśle monitorować zachowanie mod_rewrite. Gdy problem zostanie rozwiązany, zmniejsz RewriteLogLevel i świętuj.

W 100% z moich doświadczeń odkryłem, że RewriteLog pomógł mi odkryć problem z moimi regułami przepisywania. Nie mogę tego wystarczająco polecić. Powodzenia w rozwiązywaniu problemów!

Ponadto ta zakładka jest Twoim najlepszym przyjacielem: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog

Garrett Ellis
źródło
2

Co działało dla mnie (in ubuntu):

sudo su
cd /etc/apache2/mods-enabled
ln ../mods-available/rewrite.load rewrite.load

Ponadto, jak już wspomniano, upewnij się, że AllowOverride alljest ustawiony w odpowiedniej sekcji/etc/apache2/sites-available/default

Benubird
źródło