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:
Back
Top