2008-10-18 3 views
7

Ich habe eine Tomcat 6 Web App mit Apache httpd als Frontend ausgeführt. Ich verwende mod_proxy und mod_proxy_ajp, um die Anfragen an tomcat weiterzuleiten. Auf meinem Server läuft ubuntu. Jetzt versuche ich mod_rewrite zu verwenden, um das führende www zu entfernen, so dass meine kanonische Website-URL ist http://domain.com statt http://www.domain.comWie kann ich beheben, warum meine Umschreibungsregeln nicht von Apache angewendet werden?

ich eine Reihe von Tutorials zur Verwendung von mod_rewrite gelesen habe, aber ich kann kein Umschreiben erhalten Arbeit. Ich habe versucht, die Rewrite-Regel in eine .htaccess-Datei zu setzen (nachdem ich meine/etc/apache/sites-available/default-Datei geändert habe, um AllowOverride all zu setzen). Ich habe versucht, die Rewrite-Regel in apache2.conf, httpd.conf und rewrite.conf zu setzen. Ich habe alle diese mit dem eingeschriebenen Überschreiben versucht versucht. Die Protokolldatei wird erstellt, aber Apache hat nichts geschrieben. Ich dachte, dass mod_proxy irgendwie verhinderte, dass die Rewrite-Regeln verwendet wurden, also habe ich versucht, das auch zu deaktivieren ... und ich bekomme immer noch keine Neuschrift und nichts zum Log.

An diesem Punkt habe ich absolut keine Ahnung, was ich als nächstes versuchen soll. Wie gehe ich bei der Fehlersuche vor, warum Apache nicht meine Umschreibungsregeln verwendet?

Als Referenz sind hier meine Rewrite-Richtlinien:

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

bearbeiten: die Antworten unten hilfreich sind zu meinem speziellen Fall, aber wahrscheinlich nicht so nützlich für die Gemeinschaft-at-large als Antworten darüber, wie Sie behandeln Apache-Anweisungen im Allgemeinen. Gibt es zum Beispiel eine Möglichkeit, die Protokollierung an dem Punkt zu aktivieren, an dem sie mir mitteilen würde, welche Anweisungen in welcher Reihenfolge angewendet werden, während die Anfrage eingeht?

Bearbeiten 2: Ich habe Dinge zur Arbeit jetzt. Meine virtuellen Hosts waren nicht richtig eingerichtet, und ich hatte auch die Regex-Regex nicht richtig. Hier ist die endgültige Neuschreiben Anweisungen, die ich zu arbeiten:

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

Haben Sie sichergestellt, dass mod_rewrite geladen ist? –

+0

Ja. Ich habe es mit "a2enmod rewrite" geladen, was einen Symlink in mods-enabled gesetzt hat, um auf mod \ _rewrite.load in mod-available zu zeigen. Ich habe auch versucht, absichtlich eine der Rewrite-Regeln falsch zu schreiben (d. H. "Rewrite3Rule"), um zu testen, dass die Regeln tatsächlich von Apache aufgenommen werden, und Apache gibt mir eine Fehlermeldung, wie ich es erwarten würde. Wenn ich die Rechtschreibung repariere und apache neu starte, fängt es gut an. –

Antwort

4

Der Versuch, Ihre Frage zu beantworten: Apache Betrieb debuggen Sie die LogLevel auf ein niedrigeres Niveau einstellen kann (vielleicht debug). Aber selbst wenn Sie debug setzen, wenn Sie das Protokoll für das betreffende Modul deaktivieren, erhalten Sie keine Nachrichten von ihm. Zum Beispiel ist der Standardwert [RequestLogLevel][2] 0, z. B. schreibt das Modul keine Nachrichten.Ich sehe, dass Sie es auf 3 setzen, aber wie RoBorg sagte, ändern Sie es zu 9, dass vielleicht für Ihren Fall zu niedrig ist.

Versuchen Sie, Ihr Problem zu lösen: Versuchen Sie, die Art und Weise ändern Sie den Hostnamen mit der inversen Form neu schreiben - schauen, wenn der Hostname ist was Sie wollen, und wenn nicht, ändern Sie es in den gewünschten Hostnamen.

Host-Namen Canonical

Beschreibung: Wie im URL Rewriting Guide - Apache HTTP Server an der Apache-Site angegeben Das Ziel dieser Regel die Verwendung eines bestimmten Hostnamen zu zwingen, in bevorzugt gegenüber anderen Host-Namen welches benutzt werden kann, um dieselbe Seite zu erreichen. Wenn Sie zum Beispiel die Verwendung von www.example.com anstelle von example.com erzwingen möchten, können Sie eine Variante des folgenden Rezepts verwenden. Lösung:

# 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] 

In ihrem Beispiel, ändern sie example.com-www.example.com aber auf die Idee kam. Passen Sie es für Ihren Fall an.

+0

Das Escapen des Punktzeichens macht in diesem Fall keinen Unterschied –

+1

Der Punkt wird immer noch einem Punkt entsprechen, auch wenn ein maskierter Punkt nur einem tatsächlichen Punkt entsprechen würde Ein nicht gescannter Punkt passt zu allem, einschließlich des Punktes, der mit dem Punkt übereinstimmen sollte. –

+0

Sie haben beide Recht. Mein Fehler. Antwort aktualisiert –

0

Versuchen Sie, den Logging-Level bis zu 9 (das Maximum) zu erhöhen.
Achten Sie darauf, dass Apache die richtigen Rechte an der Protokolldatei hat (obwohl es, wenn es erstellt wurde, wahrscheinlich auch darauf schreiben könnte).
eine andere Rewrite-Regel versuchen, ohne Bedingung, zum Beispiel RewriteRule .* www.google.com [RL]

+0

Guter Vorschlag, aber ich sehe immer noch nicht, dass das Umschreiben funktioniert oder irgendetwas im Protokoll. –

1

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

</IfModule> 

das gleiche Problem mit meinem Server haben, aber das funktionierte

0

In diesem Zusammenhang werden diese Regeln aufgestellt? Sie können sie beispielsweise unter einem anderen virtuellen Host platzieren. Versuchen Sie, sie außerhalb eines Containers zu platzieren, wenn Sie nur eine Domäne testen möchten.

In jedem Fall gibt es eine Alternative, um 'no-www' zu erreichen, besteht darin, zwei virtuelle Hosts zu verwenden, einen für www und einen anderen für 'no-www'. www ein Umleitungen an den anderen:

<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> 
+0

Ich habe versucht, diese in meine /etc/apache2/apache2.conf, /etc/apache2/httpd.conf, /etc/apache2/mods-available/rewrite.conf (das ist symlinked von/etc/apache2/mods -aktiviert). Nach meinem Verständnis gelten diese Regeln immer. Ich betreibe hier nur eine Domain/einen virtuellen Host. –

+0

Ich habe Ihren Vorschlag versucht, und Apache beschwert sich über die Einbeziehung des Ports 80 Teil (*: 80): [Fehler] VirtualHost *: 80 - Mischen * Ports und nicht * -Ports mit einer NameVirtualHost Adresse wird nicht unterstützt, mit undefinierten Ergebnissen . Ich nahm die Portnummer heraus, und es begann gut, aber keine Weiterleitung. –

+1

Dies ist ein besserer Fall für IRC als für Stack Overflow. Es gibt viele Konfigurationen zum Debuggen. Versuchen Sie #apache auf irc.freenode.net, wenn keiner der Vorschläge hier funktioniert. –