Come posso risolvere il motivo per cui le mie regole di riscrittura non vengono applicate da Apache?

StackOverflow https://stackoverflow.com/questions/215316

  •  03-07-2019
  •  | 
  •  

Domanda

Ho un'app Web Tomcat 6 in esecuzione con apache httpd come front-end. Sto usando mod_proxy e mod_proxy_ajp per inoltrare le richieste a Tomcat. Il mio server esegue Ubuntu. Ora sto cercando di utilizzare mod_rewrite per rimuovere il www principale, in modo che l'URL del mio sito web canonico sia http://domain.com anziché http://www.domain.com

Ho letto una serie di tutorial sull'uso di mod_rewrite, ma non riesco a far funzionare alcuna riscrittura. Ho provato a mettere la regola di riscrittura in un file .htaccess (dopo aver modificato il mio / etc / apache / siti-disponibili / file predefinito per impostare AllowOverride all). Ho provato a inserire la regola di riscrittura in apache2.conf, httpd.conf e rewrite.conf. Ho provato tutti questi con la registrazione della riscrittura attivata. Il file di registro viene creato, ma apache non ha scritto nulla. Ho pensato che forse mod_proxy stava in qualche modo impedendo l'utilizzo delle regole di riscrittura, quindi ho provato a disabilitarlo ... e ancora non ricevo alcuna riscrittura, e nulla nel registro.

A questo punto non ho assolutamente idea di cosa provare dopo. Come posso risolvere il problema perché apache non utilizza le mie regole di riscrittura?

Per riferimento, ecco le mie direttive di riscrittura:

<IfModule mod_rewrite.c>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3

</IfModule>

Modifica : le risposte che seguono sono utili per il mio caso particolare, ma probabilmente non sono utili per la comunità in generale come le risposte su come risolvere i problemi delle direttive Apache in generale. Ad esempio, c'è un modo per abilitare la registrazione al punto in cui mi direbbe quali direttive vengono applicate in quale ordine con l'arrivo della richiesta?

Modifica 2 : ora ho fatto funzionare le cose. I miei host virtuali non erano impostati correttamente, e non avevo nemmeno la riscrittura regex corretta. Ecco le direttive finali di riscrittura che ho avuto modo di lavorare:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
        RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
È stato utile?

Soluzione

Prova di rispondere alla tua domanda : per eseguire il debug dell'operazione Apache puoi regolare LogLevel a un livello inferiore (forse debug ). Ma anche se si inserisce debug se si disabilita il registro per il modulo in questione, non si ricevono messaggi da esso. Ad esempio, il [RequestLogLevel] [2] predefinito è 0, ad es. Il modulo non scrive alcun messaggio. Vedo che lo hai impostato su 3 ma come RoBorg ha detto di cambiarlo in 9 che forse è troppo basso per il tuo caso.

Cercando di risolvere il tuo problema : prova a cambiare il modo in cui riscrivi il nome host usando il modulo inverso - controlla se il nome host è quello che vuoi e, in caso contrario, cambialo con il nome host che desideri . Come indicato nella Guida alla riscrittura dell'URL - Server HTTP Apache su Apache sito:

  

Nomi host canonici

     

Descrizione :       L'obiettivo di questa regola è forzare l'uso di un determinato nome host, in   preferenza per altri nomi host che   può essere utilizzato per raggiungere lo stesso sito.   Ad esempio, se si desidera forzare il   utilizzo di www.example.com invece di   esempio.com, è possibile utilizzare una variante   della seguente ricetta. Soluzione:

# To force the use of 
RewriteEngine On
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]

Nel loro esempio, cambiano da example.com a www.example.com ma hai avuto l'idea. Basta aggiustarlo per il caso.

Altri suggerimenti

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]

</IfModule>

Ho avuto lo stesso problema con il mio server, ma ha funzionato

Prova ad aumentare il livello di registrazione fino a 9 (il massimo).
Assicurati che apache disponga dei diritti corretti per il file di registro (anche se, se creato, sembra probabile che possa scrivere anche su di esso). Prova una regola di riscrittura diversa, senza condizioni, ad esempio RewriteRule. * Www.google.com [RL]

In quale contesto sono collocate queste regole? Ad esempio, potresti posizionarli in un host virtuale diverso. Prova a metterli fuori da qualsiasi contenitore se hai un solo dominio da testare.

In ogni caso, esiste un'alternativa per ottenere "no-www", consiste nell'utilizzare due host virtuali, uno per www e l'altro per "no-www". www uno reindirizza all'altro:

<VirtualHost *:80>
    ServerName www.domain.com
    Redirect permanent / http://domain.com
</VirtualHost>


<VirtualHost *:80>
    ServerName domain.com
    #The rest of the configuration (proxying, etc.)
</VirtualHost>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top