Apache 2: Negative FilesMatch / FilesNotMatch

7

Wenn ich eine Regel nur auf einige Dateien in apache2.conf anwenden möchte, kann ich <FilesMatch> verwenden.

Zum Beispiel:

<FilesMatch ".(gif|jpg|jpeg|png|mpg|avi)$">
    deny from env=hotlink
</FilesMatch>

Aber gibt es ein Gegenteil zu FilesMatch, dh ein FilesNotMatch?

Was ich erreichen möchte, ist:

<FilesMatch ".(gif|jpg|jpeg|png|mpg|avi)$">
    <FilesNotMatch "ban">
        deny from env=hotlink
    </FilesNotMatch>
</FilesMatch>

(Verweigern Sie das Hotlinking aller Bilder auf einem Server, ABER Banner)

Oder haben Sie einen Vorschlag, wie ich meinen regulären Ausdruck so ändern könnte, dass er nicht mit etwas übereinstimmt, das "Verbot" enthält?

BlaM
quelle

Antworten:

7

Leider scheint es in Apache keine Möglichkeit zu geben, eine Dateimatchung zu negieren.

Die von Apache verwendete Bibliothek für reguläre Ausdrücke ist jedoch PCRE (Perl Compatible Regular Expressions). Dies bedeutet, dass Sie die volle Kraft von Perls regulären Ausdrücken haben, einschließlich ihrer negativen Lookbehind- und Lookahead-Behauptungen . Dies sind ziemlich komplizierte und leistungsstarke Funktionen. Ich kann nicht sicher sein, ob dies funktioniert, insbesondere ohne das vollständige Layout Ihrer Bilder zu kennen, aber Sie können möglicherweise Folgendes verwenden:

<FilesMatch "(?<!ban).*\.(gif|jpg|jpeg|png|mpg|avi)$">
David Pashley
quelle
Funktioniert bei mir nicht
David Spector
1

Fast richtig - \b(?!.*ban.*)(.+)\.(gif|jpg|jpeg|png|mpg|avi)$für eine solche Ausnahme müssen Sie Regexp verwenden.

Tomasz Pala
quelle
Ich habe versucht, "\ b (?! / Test.php)" mit einer anderen Datei als test.php abzugleichen, aber es hat nicht funktioniert.
David Spector
Nun, Sie müssen nur meinem Beispiel folgen. Da Sie 'endendes $' ignoriert haben (und den Punkt über '\.' Enthalten), haben Sie wahrscheinlich einige Tests früher durchgeführt - bis zu dem Punkt, an dem rexexp fehlschlägt, aber Ihr Kommentar gibt irgendwie nicht den Ort an, an dem es passiert . Ich werde Ihren Testfall nicht reproduzieren, aber ich könnte vermuten, dass er etwas mit '/' zu tun hat, das Sie vorgestellt haben ...
Tomasz Pala
Vielen Dank! Ich habe fast immer Probleme mit regulären Ausdrücken. Jetzt versuche ich ^ (?! (Test \ .php)) $ und das funktioniert immer noch nicht. Es stimmt nicht mit "xx" überein, wenn es sollte. Ich verwende den Online-Regexp-Tester regex101.com zum Testen. Und wenn ich Ihr Beispiel versuche, stimmt es mit "a.gif" überein, wenn es nicht übereinstimmen sollte. Wahrscheinlich verstehe ich die ursprüngliche Frage nicht und verstehe das?! Operator.
David Spector
Betrachten Sie ^ (?! (Test \ .php)) $ - Wenn Sie die Negation entfernen, die nicht zu Ihrem "xx" passt, was bleibt dann übrig? ^ () $ - dh leere Zeichenfolge. Versuchen Sie ^ (?! (Test \ .php)). + $. Mein Beispiel soll mit "a.gif" übereinstimmen, aber nicht mit "ban.gif", und genau das passiert. Die akzeptierte Antwort stimmt mit "ban.gif" überein und ist daher falsch ...
Tomasz Pala
Wenn Sie mich fragen, benötigen die Perl Regular Expression-Bibliothek und alle Produkte, die sie verwenden, einen echten Negationsoperator. Der Versuch, eine "Vorausschau" -Funktion dazu zu zwingen, gut zu funktionieren, kann natürlich durchgeführt werden, jedoch nur mit großen Schwierigkeiten. PCRE muss erweitert werden.
David Spector