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?
źródło
Odpowiedzi:
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ś
Location
nagłówek wydaje się być zmieniony po tym, jak modrewrite robi swoje, a ponieważ próbowałeś zmienić nagłówek również w PHP,Location
nagłó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:
lub
źródło
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.
źródło
Czy możesz wypróbować ten alternatywny kod mod_rewrite:
źródło
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ę, tjwww.domain.com
. Czy możesz również wkleić odpowiednie linie access.log w powyższym pytaniu?czy możesz spróbować użyć [NC] zamiast [nc], może to być takie proste
źródło
Mam nadzieję, że masz dostęp do serwera. Dodano wiersz przekierowania po określonym folderze dokumentów serwisu
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
RewriteEngine on
, jak powiedziałem, że działa poprawnie na innym serwerze, po prostu nie na tym.Próbować:
źródło
Pamiętaj, aby mieć,
Options +FollowSymLinks
jeśli pracujesz w kontekście katalogu.W przeciwnym razie, jeśli używasz hostów wirtualnych opartych na nazwie, spróbuj:
źródło
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
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
ProxyPassReverse
lubHeader edit
do zmianyLocation
nagłówka.Jest to zwykła konfiguracja w celu obejścia problemu, gdy serwer zaplecza umieszcza własną nazwę hosta w
Location
nagłó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!
źródło
Mogą to być znaki niedrukowalne, takie jak null w
.htaccess
pliku.źródło
Uważam, że po warunku przepisania brakuje znaku $. Proszę spróbować:
źródło