Am Sonntag, den 29.11.2020, 08:25 +0100 schrieb Luca Bertoncello:
Am 29.11.2020 um 02:16 schrieb Daniel Leidert:
Hallo Daniel
Du nutzt mit '=~' doch eine Regex-Abfrage. Da kannst du auch alle Schlüssel in den Regex-Ausdruck schreiben, ohne jeweils einen neuen Abschnitt schreiben zu müssen. Du kannst deinen Abschnitt sogar kürzen. Schau dir mal das 3. Beispiel unter https://httpd.apache.org/docs/2.4/de/expr.html%C2%A0und https://httpd.apache.org/docs/2.4/howto/access.html#env%C2%A0an.
Alternativ könnte man die file() Funktion vielleicht so nutzen (ungetestet):
<If "%{QUERY_STRING} =~ /key=(\d+)/"> Require expr file('keys.txt') =~ $0
</If>
Ich habe so probiert. Leider geht es nicht... Apache spuckt den Fehler:
Cannot parse expression in require line: syntax error, unexpected T_REGEX_BACKREF, expecting T_REGEX or T_REGEX_I
Hast du eine Idee, wie man das umschreiben kann?
Kann sein, dass der Ausdruck in Anführungszeichen stehen muss. Also so:
Require expr "file('keys.txt') =~ $0"
[..]
Alternativ kannst du wahrscheinlich auch etwas mit mod_rewrite und RewriteMap basteln, wenn du die Schlüssel aus einer Datei auslesen möchtest.
Das wäre auch eine Möglichkeit, allerdings weiß ich nicht genau, wie ich das machen kann... Hast du vielleicht ein Tipp, bzw. ein Beispiel?
https://httpd.apache.org/docs/2.4/rewrite/rewritemap.html#txt
Nur eine Idee und ungetestet(!):
RewriteMap keys txt:/path/to/keys.txt RewriteCond %{QUERY_STRING} ! key= [NC,OR] RewriteCond %{QUERY_STRING} key=(\d+) [NC] RewriteCond ${keys:%1|NOT-ALLOWED} =NOT-ALLOWED RewriteRule ${REQUEST_URI} "-" [F,L]
Die Idee dahinter: Wenn kein Schlüssel übergeben wurde oder falls ein Schlüssel existiert und nicht in der Map enthalten ist (in Zeile 4 ist '%1' die Backref auf den Ausdruck in der Zeile davor, ALSO DEN sCHLÜSSEL), gib den Statuscode 403 zurück.
Ich habe jetzt auch gelesen, dass der reguläre Ausdruck in RewriteCond eine Perl-Regex ist. Dementsprechend könnte das in Zeile 3 funktionieren, um den längsten Treffer zu erhalten:
RewriteCond %{QUERY_STRING} key=(\d+?)
HTH und MfG Daniel