.htaccess nie przekierowuje poprawnie na stronę z prefiksem www

9

Próbuję przekierować adres URL bez www. do www.version (example.com na www.example.com). Używam zwykłego

RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

Działa to we wszystkich moich innych projektach. Jednak na tej konkretnej stronie kończy się pętla przekierowania. Oto dziwna część: próbowałem zwinąć wersję inną niż www, aby zobaczyć, jakie nagłówki wysyła curl --get http://example.com --dump-header domain.header > domain.html. Plik nagłówka wyglądał tak:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

Jednak wynikowy plik HTML był następujący:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(zwróć uwagę na różnicę adresów między plikami) Czy ktoś wie, jak to naprawić (i co do cholery to powoduje)? Wszelkie inne dyrektywy przepisujące adresy URL działają poprawnie.

EDYTUJ: dziennik przepisywania zawierał to: (dostęp do strony ma wiele osób, więc dziennik przepisywania stał się dość długi, nie jestem w 100% pewien, czy to właściwa część)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

Wiersz dziennika dostępu (prawdopodobnie właściwy):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

Definicja wirtualnego hosta:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

EDIT2: OK, właśnie zorientowałem się, że jeśli to zrobię (zrezygnowałem i spróbowałem przekierować to bez .htaccess):

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

Powoduje to DOKŁADNIE TĘ SAMĄ pętlę przekierowania. Poważnie, co do cholery? Czy ktoś ma pojęcie, co może być przyczyną tego?

szyfrować
źródło
Czy sam skompilowałeś Apache, czy? Nagłówek lokalizacji nie powinien różnić się od tego, co jest na stronie, ponieważ w tym przypadku są one pobierane z tej samej zmiennej, więc jest to dość dziwne. Zakładam, że żądania są przekazywane bezpośrednio do Apache, prawda, nie ma innego serwera pomiędzy nimi?
Tim Stone
Sam nie skompilowałem apache i nie ma między nimi innego serwera.
prawdopodobnie twój serwer NS nie jest poprawnie skonfigurowany
venimus 16.06.11
4
Nie jest konieczne powtarzanie nazwy serwera we wpisie ServerAlias.
Chris
czy możesz tutaj umieścić całą zawartość pliku
cofnąć

Odpowiedzi:

2

To, co wydaje mi się dziwne, to Location: http://domain.cz/linia nagłówka zgłaszana przez CURL. Nigdy nie przekierowujesz do tej domeny. Dziennik przekierowań również nie zawiera żadnej wzmianki o tym.

Jakoś Locationnagłówek wydaje się być zmieniony po tym, jak modrewrite robi swoje, a ponieważ próbowałeś zmienić nagłówek również w PHP, Locationnagłówek najwyraźniej zmienia się po przetworzeniu żądania. Jedyne wyjaśnienie, jakie mogę wymyślić, to to, że modyfikujesz gdzieś nagłówek lokalizacji za pomocą mod_header.

Czy sprawdziłeś wszystkie pliki konfiguracyjne (httpd.conf, dołączone pliki .conf i plik .htaccess), jeśli gdzieś znajdziesz linię podobną do tej:

Header set Location (...)

lub

Header edit Location (...)
Jakob Egger
źródło
Nie znalazłem czegoś takiego.
2
Czy łączysz się bezpośrednio z Apache, czy między nimi jest jakiś bufor lub serwer proxy, który mógłby zmienić nagłówki? Dyrektywa ProxyPassReverse może również zmienić nagłówek lokalizacji ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).
między nimi może być jakiś pełnomocnik, zajrzę do niego, jak tylko jutro pójdę do pracy.
@Jakob Egger - Nigdzie nie znalazłem dyrektywy ProxyPassReverse.
szyfr
1

Oprócz włączenia przepisywania dziennika (jeśli masz dostęp do zmiany httpd.conf), powinieneś usunąć aplikację, która mieszka na tej stronie z równania. Usuń / zmień nazwę tymczasowo domyślnego pliku index.php (lub dowolnej strony indeksu obsługującej Twoją aplikację), aby mieć pewność, że to nie powoduje tego.

Istnieje wiele raportów aplikacji (np. Wordpress), które powodują, że te domyślne strony przekierowujące Apache pojawiają się, jeśli są źle skonfigurowane.

Sprawdź także resztę konfiguracji apache, aby sprawdzić, czy istnieją inne instrukcje przekierowujące, które mogą być w konflikcie.

Gavin C.
źródło
Aplikacja jest w porządku, próbowałem na innym serwerze i w innej domenie (skopiowałem całą aplikację) i działało dobrze. Wydaje mi się, że jest to coś w konfiguracji apache, ale nie wiem, co.
Aplikacja może być w porządku, ale może również powodować konflikt z instalacją na tym serwerze. Wygląda na to, że Twoja aplikacja jest obecnie w produkcji, więc mogę zobaczyć, jak „wyłączenie” nie jest idealne. Dla zabawy możesz dodać ciąg zapytania na końcu przekierowania jako flagę ułatwiającą wykrywanie - więc / $ 1? Nowww = 1 lub coś podobnego.
Gavin C,
Nie, to NIE jest w produkcji.
Och spoko, to nie może zaszkodzić przesunąć pliku indeksu na 100% wykluczyć go jako część problemu :)
Gavin C
Och, do cholery, chciałem napisać, że to jest w produkcji, nie wiem jak to się stało :-)
0

Czy możesz wypróbować ten alternatywny kod mod_rewrite:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
anubhava
źródło
Nie powiodło się dokładnie w ten sam sposób.
czy możesz włączyć RewriteLog i zobaczyć, co wypluwa?
anubhava
Jak dokładnie mogę to zrobić? :-)
Zobacz tutaj: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Jedyną rzeczą jest to, że ta dyrektywa wchodzi w konfigurację apache NIE w .htaccess.
anubhava
1
Skopiowałem tę samą regułę (jak moja odpowiedź powyżej) do mojej instalacji Apache i uruchomiłem to samo polecenie curl, które masz w swoim pytaniu i dostałem Location: http://www.domain.com/jako część moich nagłówków, więc w moim przypadku zarówno nagłówki, jak i HTML pokazują tę samą domenę, tj www.domain.com. Czy możesz również wkleić odpowiednie linie access.log w powyższym pytaniu?
anubhava
0

czy możesz spróbować użyć [NC] zamiast [nc], może to być takie proste

venimus
źródło
A jednak to nie jest :-) (już próbowałem, nie działało)
0

Mam nadzieję, że masz dostęp do serwera. Dodano wiersz przekierowania po określonym folderze dokumentów serwisu

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

Jeśli nie masz dostępu do serwera, dodaj te wiersze na httaccess rozpoczynając / zmieniając część.

Być może nigdy nie dodałeś „RewriteEngine on” przed przekierowaniem.


źródło
Dodałem RewriteEngine on, jak powiedziałem, że działa poprawnie na innym serwerze, po prostu nie na tym.
AllowOverride All zezwalaj na dodawanie wszystkich wierszy w pliku konfiguracyjnym serwera
0

Próbować:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]
Shef
źródło
0

Pamiętaj, aby mieć, Options +FollowSymLinksjeśli pracujesz w kontekście katalogu.

W przeciwnym razie, jeśli używasz hostów wirtualnych opartych na nazwie, spróbuj:

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

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>
Chris
źródło
Zaktualizowałem pytanie o definicję VirtualHost.
Czy wypróbowałeś powyższe wiele rozwiązań VirtualHost, czy korzystasz z mod_rewrite?
Chris
Na początku nie chciałem używać wielu VirtualHostów, ale biorąc pod uwagę okoliczności, i tak spróbowałem i to nie pomogło.
0

Po przeczytaniu wszystkich odpowiedzi możesz sprawdzić plik de / etc / hosts ... może wszystkie twoje kontrole są z twojego komputera. Spróbuj uzyskać dostęp z innej lokalizacji.


źródło
Nie, nic w hostach na temat tej domeny.
0

Mam drugi pomysł. W opublikowanym dzienniku serwera znajduje się adres „192.168.1.221”, który jest adresem z sieci lokalnej. Czy wszystkie wpisy dziennika pokazują ten sam adres IP? W takim przypadku między serwerem a serwerem znajduje się serwer proxy. Ten serwer proxy prawdopodobnie używa ProxyPassReverselub Header editdo zmiany Locationnagłówka.

Jest to zwykła konfiguracja w celu obejścia problemu, gdy serwer zaplecza umieszcza własną nazwę hosta w Locationnagłówku, a nie nazwę hosta zewnętrznego serwera proxy.

Jeśli naprawdę istnieje serwer proxy, będziesz musiał zmienić konfigurację serwera proxy zamiast konfiguracji serwera zaplecza, ponieważ serwer proxy zawsze nadpisze informacje.

Oznacza to, że cały czas patrzymy na niewłaściwy serwer: Problem dotyczy serwera proxy!

Jakob Egger
źródło
Jutro dzwonię do pomocy technicznej firmy, która obsługuje ten serwer. Myślę, że to musi być to, dam ci znać.
szyfr
0

Mogą to być znaki niedrukowalne, takie jak null w .htaccesspliku.

hexdump -C .htaccess
Charlie
źródło
0

Uważam, że po warunku przepisania brakuje znaku $. Proszę spróbować:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
Cormpadre
źródło