Come abilitare mod_rewrite per Apache 2.2


474

Ho una nuova installazione di Apache 2.2 sulla mia macchina Vista, tutto funziona bene, tranne la riscrittura mod.

Ho commentato

LoadModule rewrite_module modules/mod_rewrite.s

ma nessuna delle mie regole di riscrittura funziona, anche se semplici come

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

Tutte le regole che sto usando funzionano sul mio hosting, quindi dovrebbero essere a posto, quindi la mia domanda è: c'è qualcosa di nascosto nella configurazione di Apache, che potrebbe bloccare la riscrittura delle mod?


1
in realtà il problema era che avevo un percorso sbagliato, perché $ {DOCUMENT_ROOT} mi ha indicato la directory root che era ok sull'hosting, ma sbagliata sul locale, quindi il problema non era solo RewriteEngine On, che già avevo ..
Jakub Arnold

Potete per favore cambiare la risposta accettata a questa ? L'autore dell'attuale risposta accettata ha ammesso che non è abbastanza buono.
Shadow Wizard is Ear For You

1
Come abilitare mod_rewrite in Ubuntu 12.04 LTS (dovrebbe funzionare anche in Debian) . Questo mostra l'installazione E l'attivazione, i tutorial qui sotto sorprendentemente non lo fanno :(
Sliq

3
Consiglio vivamente a tutti coloro che vogliono abilitare le direttive mod_rewrite nei file .htacces da usare AllowOverride FileInfoinvece di consentire tutto, come suggeriscono TUTTE le risposte in questa pagina. Triste nel vedere che tutte queste risposte prendono l'approccio "fintanto che funziona" va bene invece di cercare di capire le conseguenze della proposta "soluzione". Cerca di capire cosa stai facendo sul tuo server e come limitare i privilegi che hai appena ceduto AllowOverride All. RTFM! , è abbastanza chiaro sull'argomento.
RemyNL,

1
@ Nero Si trova nel file di configurazione di Apache chiamato httpd.conf. Nel mio PC, si trova nella directory C: \ xampp \ apache \ conf, perché ho installato Apache con XAMPP.
Lex Soft,

Risposte:


1005

Per poter utilizzare mod_rewriteè possibile digitare il seguente comando nel terminale:

sudo a2enmod rewrite

Riavvia apache2 dopo

sudo /etc/init.d/apache2 restart

o

sudo service apache2 restart

o secondo il nuovo sistema unificato di controllo del sistema

sudo systemctl restart apache2

Quindi, se lo desideri, puoi utilizzare il seguente .htaccessfile.

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

Il .htaccessfile sopra (se inserito nel tuo DocumentRoot) reindirizzerà tutto il traffico verso un index.phpfile a DocumentRootmeno che non esista.

Quindi, supponiamo che tu abbia la seguente struttura di directory e httpdocs sia il DocumentRoot

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

Qualsiasi file esistente in httpdocs verrà servito al richiedente utilizzando quanto .htaccesssopra indicato, tuttavia, tutto il resto verrà reindirizzato a httpdocs/index.php. I file dell'applicazione includes/appnon saranno accessibili.


15
Le idee qui sono corrette per una CLI UNIX ma i comandi funzionano solo per una distribuzione Linux basata su Debian e non per un ambiente Windows dell'OP.
Jason Rikard,

17
a2enmod rewrite ha fatto il lavoro
dott. Casper Black,

98
Nota ulteriore: è inoltre necessario assicurarsi che la configurazione del proprio sito sia AllowOverride Allin grado .htaccessdi leggere il file.
Adam Rosenfield,

2
@Dennis puoi usare a2dismod rewrite
Jonathan Mayhak

3
come posso usare a2enmod rewritein windows?
Naman,

229

Per la mia situazione, ho avuto

RewriteEngine On

nel mio .htaccess, insieme al modulo in fase di caricamento, e non funzionava.

La soluzione al mio problema era modificare la voce del mio vhost in inlcude

AllowOverride all

nella <Directory>sezione del sito in questione.


10
In effetti, anche con a2enmod rewrite& RewriteEngine Onin .htaccess- l'esistenza di AllowOverride allnel file VirtualHost gli impedirà di funzionare - questo è ciò che mi ha sorpreso, cambiandolo in modo che AllowOverride allfunzionasse come un fascino :)
HeavenCore

9
principiante qui .. dov'è il file VirtualHost?
David

3
Questa è la strada da percorrere ... Avevo impostato tutto il resto tranne questo.
arrayown

2
La AllowOverridedirettiva determina i "Tipi di direttive consentite nei .htaccessfile". Inoltre, "Quando questa direttiva è impostata su None, i .htaccessfile vengono completamente ignorati. In questo caso, il server non tenterà nemmeno di leggere i .htaccessfile nel filesystem." Documenti ufficiali: httpd.apache.org/docs/2.2/mod/core.html#allowoverride
John Erck,

Questo ha risolto il problema per me - ho avuto un problema con WordPress che i permalink non funzionavano correttamente. Se lo fai a2enmod rewritee poi nel file VirtualHosts cambia 'AllowOverride None' in 'AllowOverride All' dovrebbe funzionare. Il file VirtualHosts si applica se si eseguono più nomi di dominio sullo stesso server (e indirizzo IP). Lo avresti impostato per configurare il dominio.
Jason Preston

83

Provare a impostare: AllowOverride All.


Il secondo problema più comune non è abilitare la riscrittura mod: a2enmod rewritee quindi riavviare apache.


Questa dovrebbe essere la risposta n. 1 in quanto risolve un problema che si sta verificando in un'installazione predefinita di Ubuntu!
Sliq,

1
Ciò consentirà a .htaccess di sovrascrivere qualsiasi altra configurazione di apache. Questo non è raccomandato
Bhargav Nanekalva,

Sì :) anche questo era il mio problema, ma qui è il posto che stai spiegando per i principianti come me che questo "AllowOverride All" è in /etc/apache2/sites-available/[sitename[.conf e [sitename-ssl] .conf. Ho dovuto fare una seconda ricerca grazie a te: D, grazie comunque!
MetaTron

77

Se non funziona sopra, prova a modificare / etc / apache2 / sites-enabled / 000-default

quasi in cima troverai

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

Cambia AllowOverride NoneinAllowOverride All

questo ha funzionato per me


Errore modificato da /laravel/public/authors was not found on this servera/index.php was not found on this server
Gangaraju,

non riesco a trovare <Directory>, solo <VirtualHost *: 80>
Nicolas S.Xu

1
@ NicolasS.Xu inseriscilo nel tag <VirtualHost *: 80>
wimdetr

Ho fatto lo stesso, ma ho aggiunto una nuova sezione <Directory /var/www/html>per applicare la regola solo da questa cartella.
Louis Loudog Trottier

44

In Ubuntu:

Correre:

a2enmod rewrite

e poi:

service apache2 restart

mod_rewrite sarà ora abilitato!


28

Esistono molti modi per risolvere questo problema, se si conosce la radice del problema.

Problema 1

In primo luogo, potrebbe essere un problema con il tuo apache che non ha il modulo mod_rewrite.c installato o abilitato.

Per questo motivo, dovresti abilitarlo come segue

  1. Apri la tua console e digita al suo interno, questo:

    sudo a2enmod rewrite

  2. Riavvia il tuo server Apache.

    service apache2 restart

Problema 2

  1. Inoltre, in caso contrario, potrebbe essere necessario modificare la regola di sostituzione dal file conf di apache (apache2.conf, http.conf o file 000-default).

  2. Individua "Directory / var / www /"

  3. Modifica "Sostituisci nessuno" in "Sostituisci tutto"

Problema 3

Se viene visualizzato un errore che indica che il modulo di riscrittura non viene trovato, probabilmente il modulo userdir non è abilitato. Per questo motivo è necessario abilitarlo.

  1. Digita questo nella console:

    sudo a2enmod userdir

  2. Quindi provare ad abilitare il modulo di riscrittura se non è ancora abilitato (come menzionato sopra).

Per ulteriori informazioni al riguardo, è possibile visitare questo sito: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html


2
Grande ripartizione del problema.
Banago,

Non utilizzare AllowOverride Allin quanto abiliterà troppe funzionalità di dangerours (come l'utilizzo degli script perl). Invece usaAllowOveride Options
Marki555 il

28

La nuova versione di Apache è cambiata in qualche modo. Se la tua versione di apache è 2.4, devi andare a /etc/apache2/. Ci sarà un file chiamato apache2.conf. Devi modificarlo (dovresti avere il permesso di root). Cambia il testo della directory in questo modo

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

Ora riavvia apache.

service apache2 reload

Spero funzioni.


Questa è la risposta aggiornata.
Paul

1
Se sei nel 2019 e oltre, per favore vota questa risposta :)
Luiz Cavalcanti,

27

Apri terminale e digita a2enmod rewrite, abiliterà il tuo mod_rewritemodulo per Apache.

Quindi vai a /etc/apache2/sites-availablee modifica il file predefinito. (Per questo è necessario disporre delle autorizzazioni scrivibili per questo file e la cartella disponibile per i siti.)

Sostituisci di seguito con le linee esistenti da 4 a 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>

Ora riavvia Apache di /etc/init.d/apache2 restartoservice apache2 restart

Ripeti il ​​test URL pulito e questa volta verrà superato.


15

<Modifica>

Ho appena notato che hai detto mod_rewrite.s invece di mod_rewrite.so - spero che sia un refuso nella tua domanda e non nel file httpd.conf! :)

</ Modifica>

Sono più abituato ad usare Apache su Linux, ma ho dovuto farlo l'altro giorno.

Prima di tutto, dai un'occhiata nella tua directory di installazione di Apache. (Presumo che tu l'abbia installato su "C: \ Programmi" qui)

Dai un'occhiata nella cartella: "C: \ Programmi \ Apache Software Foundation \ Apache2.2 \ modules" e assicurati che ci sia un file chiamato mod_rewrite.so. (Dovrebbe essere, viene fornito come parte dell'installazione predefinita.

Quindi, apri "C: \ Programmi \ Apache Software Foundation \ Apache2.2 \ conf" e apri httpd.conf. Assicurati che la linea:

#LoadModule rewrite_module modules/mod_rewrite.so

è senza commento:

LoadModule rewrite_module modules/mod_rewrite.so

Inoltre, se si desidera abilitare RewriteEngine per impostazione predefinita, è possibile aggiungere qualcosa di simile

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

alla fine del tuo file httpd.conf.

In caso contrario, assicurati di specificare

RewriteEngine On

da qualche parte nel tuo file .htaccess.


@gabehabe il tuo avatar sembrava solo che contenesse un'icona il mio doc, lol
Jonathan dos Santos

5

L'ho appena fatto

sudo a2enmod rewrite

quindi è necessario riavviare il servizio apache seguendo il comando

sudo service apache2 restart


4

Usa il comando seguente

sudo a2enmod rewrite

E il riavvio apache tramite il comando seguente

sudo service apache2 restart

3

Esiste ovviamente più di un modo per farlo, ma suggerirei di utilizzare il più standard:

ErrorDocument 404 /index.php?page=404

3

La prima volta che ho lottato con le regole di mod_rewrite ignorando il mio traffico, ho imparato (frustrante) che le avevo messe nel modo sbagliato <VirtualHost>, il che significava che il mio traffico le avrebbe ignorate tutte , non importa quanto fossero ben scritte. Assicurati che non ti stia succedendo:

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

Questi parametri si attiveranno se esegui un riavvio grazioso di Apache, quindi puoi riciclarli e monitorare attentamente il comportamento mod_rewrite. Una volta risolto il problema, abbassa nuovamente RewriteLogLevel e festeggia.

Nel 100% della mia esperienza, ho scoperto che RewriteLog mi ha aiutato a scoprire il problema con le mie regole di riscrittura. Non posso raccomandarlo abbastanza. Buona fortuna per la risoluzione dei problemi!

Inoltre, questo segnalibro è il tuo migliore amico: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog


2

Cosa ha funzionato per me (in Ubuntu):

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

Inoltre, come già accennato, assicurarsi che AllowOverride allsia impostato nella relativa sezione di/etc/apache2/sites-available/default

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.