Ich versuche, eine URL ohne www umzuleiten. zu www.version (example.com zu www.example.com). Ich benutze das übliche
RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Dies funktioniert bei allen meinen anderen Projekten. Auf dieser speziellen Site endet sie jedoch mit einer Umleitungsschleife. Hier ist der seltsame Teil: Ich habe versucht, die Nicht-WWW-Version zu locken, um zu sehen, welche Header sie sendet
curl --get http://example.com --dump-header domain.header > domain.html
. Die Header-Datei sah folgendermaßen aus:
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
Die resultierende HTML-Datei war jedoch folgende:
<!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>
(Beachten Sie den Adressunterschied zwischen den Dateien.) Weiß jemand, wie man das behebt (und was zum Teufel es verursacht)? Alle anderen Anweisungen zum Umschreiben von URLs funktionieren einwandfrei.
BEARBEITEN: Das Umschreibungsprotokoll enthielt Folgendes: (Auf die Site wird von vielen Personen zugegriffen, sodass das Umschreibungsprotokoll ziemlich lang wurde. Ich bin nicht 100% sicher, ob dies der richtige Teil ist.)
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]
Die Zugriffsprotokollzeile (wahrscheinlich die richtige):
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"
Die Definition des virtuellen Hosts:
<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: Okay, ich habe gerade herausgefunden, dass wenn ich das tue (zurückgetreten und versucht, dies ohne .htaccess umzuleiten):
//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');
Es verursacht genau die gleiche Umleitungsschleife. Ernsthaft, was zur Hölle? Hat jemand eine Idee, was dies möglicherweise verursachen könnte?
quelle
Antworten:
Was mir seltsam vorkommt, ist die
Location: http://domain.cz/
von CURL gemeldete Kopfzeile. Sie leiten niemals zu dieser Domain weiter. Das Umleitungsprotokoll enthält auch keine Erwähnung.Irgendwie
Location
scheint der Header geändert zu werden, nachdem Modrewrite seine Arbeit erledigt hat, und da Sie versucht haben, den Header auch mit PHP zu ändern, wird derLocation
Header anscheinend geändert, nachdem die Anforderung verarbeitet wurde. Die einzige Erklärung, die mir einfällt, ist, dass Sie den Speicherort-Header irgendwo mit mod_header ändern.Haben Sie alle Konfigurationsdateien (httpd.conf, die enthaltenen .conf-Dateien und die .htaccess-Datei) überprüft, wenn Sie irgendwo eine ähnliche Zeile gefunden haben:
oder
quelle
Zusätzlich zum Aktivieren des Umschreibprotokolls (wenn Sie Zugriff auf die Änderung der httpd.conf haben) sollten Sie die Anwendung, die sich auf dieser Site befindet, aus der Gleichung entfernen. Entfernen / benennen Sie die Standard-index.php (oder die Indexseite, die Ihre App bedient) vorübergehend um, um sicherzustellen, dass dies nicht verursacht wird.
Es gibt viele Berichte über Anwendungen (z. B. WordPress), die dazu führen, dass diese Apache-Standardumleitungsseite angezeigt wird, wenn sie falsch konfiguriert sind.
Überprüfen Sie auch den Rest der Apache-Konfiguration, um festzustellen, ob andere Umleitungsanweisungen vorliegen, die möglicherweise in Konflikt stehen.
quelle
Können Sie diesen alternativen mod_rewrite-Code ausprobieren:
quelle
Location: http://www.domain.com/
als Teil meiner Header erhalten, sodass in meinem Fall sowohl Header als auch HTML dieselbe Domain anzeigen, dwww.domain.com
. H. Können Sie in Ihrer obigen Frage auch relevante access.log-Zeilen einfügen?Könnten Sie versuchen, [NC] anstelle von [nc] zu verwenden, könnte so einfach sein
quelle
Ich hoffe, Sie haben Serverzugriff. Die Umleitungszeile wurde hinzugefügt, nachdem der angegebene Site-Dokumentordner gefolgt wurde
Wenn Sie keinen Zugriff für den Server haben, fügen Sie diese Zeile bei httaccess hinzu, indem Sie den Teil starten / ändern.
Möglicherweise haben Sie vor der Umleitung noch nicht "RewriteEngine on" hinzugefügt.
quelle
RewriteEngine on
, wie gesagt, es funktioniert auf einem anderen Server richtig, nur nicht auf diesem.Versuchen:
quelle
Stellen Sie sicher, dass
Options +FollowSymLinks
Sie in einem Verzeichniskontext arbeiten.Andernfalls versuchen Sie Folgendes, wenn Sie namensbasierte virtuelle Hosts verwenden:
quelle
Nachdem Sie alle Antworten gelesen haben, können Sie die Datei de / etc / hosts überprüfen ... möglicherweise stammen alle Ihre Überprüfungen von Ihrem Computer. Versuchen Sie, von einem anderen Ort aus darauf zuzugreifen.
quelle
Ich habe eine zweite Idee. Das von Ihnen gepostete Serverprotokoll zeigt eine Adresse von "192.168.1.221", eine Adresse aus dem lokalen Netzwerk. Zeigen alle Protokolleinträge dieselbe IP-Adresse? In diesem Fall besteht ein Proxy zwischen Ihnen und dem Server. Dieser Proxy verwendet
ProxyPassReverse
oderHeader edit
zum Ändern desLocation
Headers.Dies ist eine übliche Einrichtung, um das Problem zu umgehen, wenn der Back-End-Server seinen eigenen Hostnamen
Location
anstelle des Hostnamens des externen Proxyservers in den Header einfügt.Wenn es wirklich einen Proxyserver gibt, müssen Sie die Konfiguration des Proxyservers und nicht die Konfiguration des Backend-Servers ändern, da der Proxy die Informationen immer überschreibt.
Dies bedeutet, dass wir die ganze Zeit auf den falschen Server gesucht haben: Das Problem ist mit dem Proxyserver!
quelle
Könnten nicht druckbare Zeichen wie null in der
.htaccess
Datei sein.quelle
Ich glaube, Sie vermissen ein $ -Zeichen nach Ihrer Umschreibungsbedingung. Bitte versuche:
quelle