Ich habe eine Web-App auf zwei Servern installiert. Auf einem der Server erhalte ich beim Zugriff auf die Homepage im Browser den Fehler „Fehlercode: ERR_TOO_MANY_REDIRECTS“, während auf dem anderen alles einwandfrei funktioniert. Auf beiden Servern läuft Apache 2.4.
Welcher Teil der Apache-Konfiguration bezieht sich auf die Umleitungsregeln? Wo muss ich nach Unterschieden zwischen den beiden Konfigurationen suchen?
Nur für den Fall, hier ist die htaccess-Datei:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
# Get rid of index.php
RewriteCond %{REQUEST_URI} /index\.php
RewriteRule (.*) index.php?rewrite=2 [L,QSA]
# Rewrite all directory-looking urls
RewriteCond %{REQUEST_URI} /index.php/$
RewriteRule (.*) index.php?rewrite=1 [L,QSA]
# Try to route missing files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} public\/ [OR]
RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
RewriteRule . - [L]
# If the file doesn't exist, rewrite to index
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]
</IfModule>
# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On
# @todo This may not be effective in some cases
FileETag Size
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
Antwort1
Ich stelle oft fest, dass solch abweichendes Verhalten auf Unterschiede in der Konfiguration zurückzuführen ist. Dafür habe ich ein Skript geschrieben (httpd-dump-config) um httpd.conf zu vereinfachen, damit ich es vergleichen und auf Unterschiede zwischen Clusterknoten oder zwischen Umgebungen prüfen kann (sogar über SSH)
Es prüft zwar keine .htaccess-Dateien, kann aber trotzdem helfen, leicht zu übersehende .htaccess-Dateien zu finden:
find $(httpd-dump-config | grep -i DocumentRoot | awk '{print $2}') -type f -name '.htaccess' -print
Ich empfehle nicht, das oben genannte mit ssh&diff zu versuchen, wie unten gezeigt (weil das Escapen Sie töten wird)
Vergleich der Nicht-.htaccess-Konfiguration der beiden Maschinen:
diff <(httpd-dump-config) \
<(ssh webserverB.dom httpd-dump-config)
Es besteht auch die Möglichkeit, dass vom Code aus eine Umleitung ausgegeben wird (z. B. wenn PHP einen Location-Header sendet, wie er in vielen PHP-Programmen, die ich gesehen habe, häufig verstreut oder anderweitig versteckt ist).
Antwort2
Tritt dieser Fehler in allen Browsern auf?
Jedes Mal, wenn ich auf dieses Problem stoße, liegt es entweder an einer kleinen Störung in einem bestimmten Browser oder an einer seltsamen URL.
Umschreibregeln sind normalerweise diese
RewriteEngine on
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$**1
"Das Problem hierbei ist, dass dies nur für Seiten innerhalb des DocumentRoot funktioniert. Sie können zwar weitere Bedingungen hinzufügen (beispielsweise um auch Homedirs usw. zu behandeln), aber es gibt eine bessere Variante:"
RewriteEngine on
RewriteCond %{REQUEST_URI} !-U
RewriteRule ^(.+) http://webserverB.dom/$1**
"Hierbei wird die URL-Vorausschaufunktion von mod_rewrite verwendet. Dies funktioniert für alle URL-Typen und ist eine sichere Methode. Allerdings wirkt sich dies auf die Leistung des Webservers aus, da für jede Anforderung eine weitere interne Unteranforderung vorhanden ist. Wenn Ihr Webserver also auf einer leistungsstarken CPU läuft, verwenden Sie diese. Wenn es sich um eine langsame Maschine handelt, verwenden Sie den ersten Ansatz oder besser ein ErrorDocument-CGI-Skript."
Sie können auch einen Blick aufErweiterte Umleitung.