2008-10-18 20 views
7

Mam aplikację webową tomcat 6 z apache httpd jako front end. Używam mod_proxy i mod_proxy_ajp do przekazywania żądań do tomcat. Na moim serwerze działa ubuntu. Teraz staram się używać mod_rewrite aby usunąć główną www, tak, że moja kanoniczny URL strony jest http://domain.com zamiast http://www.domain.comJak mogę rozwiązać problem, dlaczego moje reguły przepisywania nie są stosowane przez apache?

Czytałem kilka tutoriali na temat korzystania z mod_rewrite, ale nie mogę nic na przepisywanie praca. Próbowałem wstawić regułę przepisywania w pliku .htaccess (po zmodyfikowaniu pliku/etc/apache/sites-available/default, aby ustawić AllowOverride wszystkie). Próbowałem już wstawić regułę przepisywania w apache2.conf, httpd.conf i rewrite.conf. Próbowałem już wszystkich z włączonym logowaniem wielokrotnego zapisu. Plik logu zostanie utworzony, ale apache nic na nim nie napisał. Pomyślałem, że może mod_proxy uniemożliwiło użycie reguł przepisywania, więc spróbowałem wyłączyć to również ... i wciąż nie mogę napisać od nowa i nic w dzienniku.

W tym momencie nie mam absolutnie pojęcia, co dalej. Jak mogę rozwiązać problem, dlaczego Apache nie stosuje reguł przepisywania?

Dla porównania, tutaj są moje dyrektyw przepisujące:

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

Edit: poniżej odpowiedzi są pomocne w moim konkretnym przypadku, ale chyba nie tak pomocne dla społeczności-at-large jako odpowiedzi na temat sposobu rozwiązywać ogólne problemy z dyrektywami apache. Na przykład, czy istnieje sposób, aby włączyć rejestrowanie do punktu, w którym informuje mnie, które dyrektywy są stosowane w jakiej kolejności, w zależności od żądania?

Edytuj 2: Mam już rzeczy do roboty. Moje wirtualne hosty nie były skonfigurowane poprawnie, a także nie miałem dość przepisania regularnego wyrażenia regularnego. Oto ostateczne dyrektywy do przepisywania, które mam do wykonania:

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

Masz pewność, że załadowany jest moduł mod_rewrite? –

+0

Tak. Załadowałem go za pomocą "a2enmod rewrite", które ustawia dowiązanie symboliczne w modach, aby wskazywało na mod \ _rewrite.load w mod-available. Próbowałem również celowo przepisać jedną z reguł przepisywania (np. "Rewrite3Rule"), aby sprawdzić, czy reguły są pobierane przez apache, a apache podaje komunikat o błędzie, jak się spodziewałam. Kiedy poprawiam pisownię i zrestartuję apache, restartuje się dobrze. –

Odpowiedz

4

Starając się odpowiedzieć na pytanie: Do debugowania Apache operacji można dostosować LogLevel do niższego poziomu (może debug). Ale nawet jeśli wstawisz debug, jeśli wyłączysz Log dla danego modułu, nie otrzymasz od niego żadnych wiadomości. Na przykład domyślny [RequestLogLevel][2] wynosi 0, np. Moduł nie zapisuje żadnych wiadomości.Widzę, że ustawiłeś go na 3, ale jak powiedział RoBorg, zmień go na 9, który być może jest za niski dla twojego przypadku.

Próbując sove problemu: Spróbuj zmienić sposób przepisać nazwę hosta przy użyciu formularza odwrotną - wyglądają jeśli nazwa hosta jest to, co chcesz, a jeśli nie, zmień go do hosta chcesz. Jak stwierdzono w URL Rewriting Guide - Apache HTTP Server na Stronie Apache:

kanoniczne Nazwy hostów

Opis: Celem tej zasady jest to, aby wymusić użycie konkretnego hosta w preferencji dla innych hostów która może być użyta do uzyskania dostępu do tej samej witryny za pomocą numeru . Na przykład, jeśli chcesz wymusić użycie adresu www.example.com zamiast , możesz użyć wariantu następującego przepisu. Rozwiązanie:

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

W ich przykład, zmienić example.com do www.example.com ale masz pomysł. Po prostu dostosuj go do swojego przypadku.

+0

Uskoknięcie znaku kropki nie zmieni w tym przypadku –

+1

Kropka będzie nadal pasować kropką, nawet jeśli kropka zbiegów byłaby zgodna tylko z rzeczywistą kropką kropka bez znaku będzie pasować do wszystkiego, łącznie z kropką, którą kropka miała dopasować. –

+0

Oboje macie rację. Mój błąd. Odpowiedź zaktualizowana. –

0

Spróbuj zwiększyć poziom rejestrowania do 9 (maksymalny).
Upewnij się, że apache ma odpowiednie prawa do pliku dziennika (chociaż jeśli go utworzył, prawdopodobnie będzie mógł do niego napisać).
Spróbuj inną regułę przepisywania, bez kondycji, na przykład RewriteRule .* www.google.com [RL]

+0

Dobra sugestia, ale wciąż nie widzę ani przepisywania, ani niczego w dzienniku. –

1

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

</IfModule> 

miał ten sam problem z moim serwerem, ale to działało

0

W jakim kontekście są te reguły umieszczone? Możesz na przykład umieszczać je pod innym wirtualnym hostem. Spróbuj umieścić je poza kontenerem, jeśli masz tylko jedną domenę do przetestowania.

W każdym razie istnieje alternatywa dla osiągnięcia "no-www", polega na użyciu dwóch wirtualnych hostów, jednego dla www i drugiego dla "no-www". www przekierowuje jeden do drugiego:

<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

Próbowałem umieścić je w moim /etc/apache2/apache2.conf, /etc/apache2/httpd.conf, /etc/apache2/mods-available/rewrite.conf (który jest dowiązany symbolicznie z/etc/apache2/mods -włączone). Rozumiem, że zasady te zawsze będą miały zastosowanie. Używam tutaj tylko jednej domeny/wirtualnego hosta. –

+0

Wypróbowałem twoją sugestię, a apache skarży się na włączenie części portu 80 (*: 80): [błąd] VirtualHost *: 80 - mieszanie * portów i portów innych niż * z adresem NameVirtualHost nie jest obsługiwane, postępowanie z nieokreślonymi wynikami . Wyjąłem numer portu i zrestartowałem go dobrze, ale bez przekierowania. –

+1

Jest to przypadek bardziej odpowiedni dla IRC niż dla przepełnienia stosu. Istnieje wiele konfiguracji do debugowania. Wypróbuj #apache na irc.freenode.net, jeśli żadna z poniższych sugestii nie działa. –