RewriteRule - Umgebungsvariable an CGI durchreichen


GwenDragon

Registered User
Ich schildere mal das Vorhaben: Über RewriteCond bestimmte Abfragen auf z.B. REMOTE_ADDR machen, dies als Umgebunsvariable durch reichen an ein CGI.

Im .htaccess:
Code:
RequestHeader set X-BLOCKED " "

RewriteCond expr "-R '34.1.208.0/20'"        [OR]
RewriteCond expr "-R '34.35.0.0/16'"        [OR]
RewriteCond expr "-R '34.152.86.0/23'"        [OR]
# usw.
RewriteCond expr "-R '34.177.50.0/23'"  
RewriteRule ^.+ /cgi-bin/block.pl [E=X-BLOCKED:%{REMOTE_ADDR},L]

HTTP_X_BLOCKED wird zwar im Hash %ENV erzeugt, aber nicht gefüllt.

[E=HTTP_X_BLOCKED:%{REMOTE_ADDR},L] hilft auch nicht weiter.

Wo ist mein Denkfehler?
 
Last edited:
Ich bin zwar jetzt nicht der Profi, was Rewrites angeht, aber IMHO sollte die Syntax korrekt sein, um Umgebungsvariablen für das CGI Skript zu setzen. Aber ich glaube, der Name der Variable sollte X_BLOCKED sein, nicht HTTP_X_BLOCKED oder X-BLOCKED (und natürlich prüfen, ob das CGI Skript die richtige Variable ausliest).
 
Am Programmcode des Perl- oder PHP liegt es nicht.

Ich habe mal es so gesetzt:
Code:
RequestHeader set WHYBLOCKED " "

RewriteCond expr "-R '34.1.208.0/20'"        [OR]
RewriteCond expr "-R '34.35.0.0/16'"        [OR]
RewriteCond expr "-R '34.152.86.0/23'"        [OR]
# usw.
RewriteCond expr "-R '34.177.50.0/23'"
RewriteRule ^.+ /cgi-bin/block.pl [E=WHYBLOCKED:%{REMOTE_ADDR},L]

Die Umgebungsvariable gibt es dann als HTTP_WHYBLOCKED im Skript. Aber ohne Wert.
Also wird es durch das Rewrite-Flag E=WHYBLOCKED:%{REMOTE_ADDR} nicht gesetzt.

PS: Ist in PHP genauso. Muss also irgendwie am Rewrite liegen. ☹️
 
ich vermute, das Problem aktuell hier zu finden:
Code:
RequestHeader set WHYBLOCKED " "
Damit setzt du ja einen Header und keine Variable.
Was passiert, wenn du diese Zeile entfernst?
 
Seltsam, das hier klappt!
Apache config:
RequestHeader set WHYBLOCKED "expr=IP %{REMOTE_ADDR}"
RewriteRule .* - [E=WHYBLOCKED:%{WHYBLOCKED}]

Warum RequestHeader als Zwischenspeicher nötig ist? Und warum ich %{REMOTE_ADDR} nicht im Rewrite-Flag setzen kann? :unsure:
 
Last edited:
Ich wollte nur sagen, dass ich es selbst lösen konnte.
Na, so ging es:
Apache config:
RequestHeader set WHYBLOCKED "expr=IP %{REMOTE_ADDR}"
RewriteRule .* - [E=WHYBLOCKED:%{WHYBLOCKED}]
RewriteCond expr "-R '34.1.208.0/20'"        [OR]
RewriteCond expr "-R '34.35.0.0/16'"        [OR]
RewriteCond expr "-R '34.152.86.0/23'"        [OR]
RewriteCond expr "-R '34.177.50.0/23'"        [OR]
…
RewriteCond expr "-R '34.128.62.0/23'"       

RewriteRule ^.*     /cgi-bin/block.pl        [L]
 
Jetzt ging meine Lösung mehrere Monate. Gerstern entdeckte ich, das im erzeugten Log des Skripts nicht mehr der Grund für die Blockierung drin war.

Hat sich da irgendwas geändert in Apache/2.4.66 bei RewriteRule ?
Denn die Umgebungsvariable HTTP_WHYBLOCKED wird nun nicht mehr gesetzt oder ans CGI weiter gereicht.

Irgendeine Idee was nun an der .htaccess Probleme machen könnte?

//EDIT:
Sieht so aus as würde bei mehreren RequestHeader + RewriteRule die letzte Regel dann WHYBLOCKED überschreiben.
RequestHeader set WHYBLOCKED "expr=UA %{HTTP_USER_AGENT}"
RewriteRule ^.* - [E=WHYBLOCKED:%{WHYBLOCKED}]
RewriteCond %{HTTP_USER_AGENT} 007ac9 [NC,OR]
… und diverse andere
RewriteCond %{HTTP_USER_AGENT} 008/ [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]

RequestHeader set WHYBLOCKED "expr=URI %{REQUEST_URI}"
RewriteRule .* - [E=WHYBLOCKED:%{WHYBLOCKED}]
RewriteCond %{REQUEST_URI} servlet [NC,OR]
… und diverse andere
RewriteCond %{REQUEST_URI} /wordpress [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]

RequestHeader set WHYBLOCKED "expr=REF %{HTTP_REFERER}"
RewriteRule ^.* - [E=WHYBLOCKED:%{WHYBLOCKED}]
RewriteCond %{HTTP_REFERER} verybaddom.ork [NC,OR]
RewriteCond %{HTTP_REFERER} badguyz.ru [NC,OR]
… und diverse andere
RewriteCond %{HTTP_REFERER} bad.com [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]

Was ich erreichen wollte, ist dass jeder Block dessen RewriteCond greift die block.pl triggert.
 
Last edited:
Apache verarbeitet seine Configs grundsätzlich strikt "von oben nach unten" und zusätzlich "last match wins", das hat sich auch nie verändert.
Deshalb wird auch nur das letzte "RequestHeader set WHYBLOCKED ..." verabeitet und alle vorherigen verworfen. Dadurch werden (alle) Deine RewriteRules nur gegen HTTP_REFERER geprüft und niemals gegen HTTP_USER_AGENT oder REQUEST_URI.

Du solltest für jeden WHYBLOCKED einen eigenen eindeutigen WHYBLOCKED_$ID verwenden.

HTH
 
@Joe User Also du meinst so:
RequestHeader set WHYBLOCKED_URI "expr=URI %{REQUEST_URI}"
RewriteRule .* - [E=WHYBLOCKED:%{WHYBLOCKED_URI}]
RewriteCond %{REQUEST_URI} servlet [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]

Oder so?
RequestHeader set WHYBLOCKED_URI "expr=URI %{REQUEST_URI}"
RewriteRule .* - [E=WHYBLOCKED_URI:%{WHYBLOCKED_URI}]
RewriteCond %{REQUEST_URI} servlet [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]
oder so:
RequestHeader set WHYBLOCKED_URI "expr=URI %{REQUEST_URI}"
RewriteRule .* - [E=WHYBLOCKED_URI:%{WHYBLOCKED_URI}]
RewriteCond %{REQUEST_URI} servlet [NC]
RewriteRule ^.* /cgi-bin/block.pl [L,E=WHYBLOCKED_URI:%{WHYBLOCKED_URI}]
 
Last edited:
Um bei Post #8 von Dir zu bleiben, meine ich das so:

Code:
RequestHeader set WHYBLOCKED_UA "expr=UA %{HTTP_USER_AGENT}"
RewriteRule ^.* - [E=WHYBLOCKED_UA:%{WHYBLOCKED_UA}]
RewriteCond %{HTTP_USER_AGENT} 007ac9 [NC,OR]
… und diverse andere
RewriteCond %{HTTP_USER_AGENT} 008/ [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]

RequestHeader set WHYBLOCKED_URI "expr=URI %{REQUEST_URI}"
RewriteRule .* - [E=WHYBLOCKED_URI:%{WHYBLOCKED_URI}]
RewriteCond %{REQUEST_URI} servlet [NC,OR]
… und diverse andere
RewriteCond %{REQUEST_URI} /wordpress [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]

RequestHeader set WHYBLOCKED_REF "expr=REF %{HTTP_REFERER}"
RewriteRule ^.* - [E=WHYBLOCKED_REF:%{WHYBLOCKED_REF}]
RewriteCond %{HTTP_REFERER} verybaddom.ork [NC,OR]
RewriteCond %{HTTP_REFERER} badguyz.ru [NC,OR]
… und diverse andere
RewriteCond %{HTTP_REFERER} bad.com [NC]
RewriteRule ^.* /cgi-bin/block.pl [L]
 
@Joe User Danke für deine Antwort.
Ich habe es nun geändert in die .htaccess gesetzt.

Seltsam, die Umgebungsvariable wird aber nicht für block.pl weiter gereicht, im Skript fragt der Kollege sie als HTTP_WHYBLOCKED_REF ab.
Das sollte doch trotz suxexec als Umgebungsvariable im Skript lesbar sein.
Wo ist mein Denkfehler bei den Rewrites?

//EDIT:
Auch ein PHP per FPM oder FastCGI bekommt nichts bei rewrite von den WHYBLCKED_…,, keine HTTP_WHYBLOCKED_… auch keine REDIRECT_WHYBLOCKED_… in $_SERVER[] mit.
 
Last edited:

Back
Top