it-swarm.com.de

Verwenden von Umgebungsvariablen mit RewriteRule und ErrorDocument

Ich habe Probleme mit der folgenden Konfiguration auf meinem Apache-Server, um einige URLs neu zu schreiben.

SetEnv PATH_TO_DIR /directory

RewriteRule ^%{PATH_TO_DIR}/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-\.]+)/?$ /index.php?dir=$1&file=$2

ErrorDocument 404 %{PATH_TO_DIR}/index.php?dir=null&file=error

Diese Konfiguration funktionierte einwandfrei, bis ich SetEnv PATH usw. verwendete. Ich muss dies verwenden, da es viele Regeln gibt, nicht nur die oben genannten.

Kann jemand auf meinen Fehler hinweisen?

Apache kehrt zurück

%{PATH_TO_DIR}/index.php?dir=null&file=error

wenn ich etwas versuche (www.site.com/foo/bar zum Beispiel).

Apache gibt das ErrorDocument zurück, wenn ich nur versuche, den Index abzurufen.

Ich weiß, es ist kein Problem mit den Umschreiberegeln, weil sie funktionieren, wenn ich die Variable PATH_TO_DIR entferne und sie nur hart codiere.

4
misterte

Sie können im regulären Ausdruck einer RewriteRule keine Variablen pro Anforderung verwenden, wie sie von SetEnv erstellt wurden. Der Regex wird beim Start kompiliert.

Sie können Variablen mit der richtigen Syntax nur zum Ersetzen eines Umschreibens (2. Parameter) verwenden.

4
covener

Das Problem hier war ErrorDocument, das keine Server-Umgebungsvariablen interpoliert ...

3
tonix

Sollte %{PATH_TO_DIR} nicht %{ENV:PATH_TO_DIR} sein? Ich bin mir auch nicht sicher, ob Sie diese Variablen in der Regel verwenden können. Ich denke, sie können nur in RewriteCond verwendet werden.

Schauen Sie es sich an hier und hier , speziell zu diesem Satz:

Wenn Sie eine Übereinstimmung mit dem Hostnamen, dem Port oder der Abfragezeichenfolge erzielen möchten, verwenden Sie eine RewriteCond mit den Variablen% {HTTP_Host},% {SERVER_PORT} bzw.% {QUERY_STRING}

2
coredump

Hinzufügen zur Covener-Analyse:

Sie können Umgebungsvariablen beim Umschreiben verwenden, aber wie Sie bereits erwähnt haben, behält SetEnv diese Informationen (meines Wissens) nicht bei. Ich habe gute Erfolge mit erzwungenen variablen Injektionen in meinen Startskripten erzielt. Wenn Sie beispielsweise die Binärdateien apachectl oder httpd aufrufen, können Sie Folgendes tun:

Führen Sie in Ihrem Shell-Skript Folgendes aus (ich verwende die case-Syntax und füge eine Option für startMaint hinzu):

MAINTENANCE=TRUE ${Apache_ROOT}/bin/apachectl -d ${Apache_ROOT} -f ${Apache_CONF} -k start

RewriteCond %{ENV:MAINTENANCE} ^TRUE$
RewriteCond %{REQUEST_FILENAME} !\.(gif|jpg|png|ico)$ [NC]
RewriteCond %{REQUEST_URI} ^/(status|uri1|uri2|uri3|etc).*$ [NC]
RewriteCond %{REQUEST_URI} !^/static/siteMaintenance.html$ [NC]
RewriteRule .* /static/siteMaintenance.html${pages:%1:NULL}? [R=302,L]
1
Jess