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 und
> > https://httpd.apache.org/docs/2.4/howto/access.html#env an.
> >
> > 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


Antwort per Email an