nginx gibt 404 zurück, wenn der Abfrageparameter das Sonderzeichen „

nginx gibt 404 zurück, wenn der Abfrageparameter das Sonderzeichen „

Ich habe URLhttps://myhost.test/de/searchResult?param=<

Ich möchte 404 zurückgeben, wenn der Abfrageparameter das Sonderzeichen „<“ enthält.

https://myhost.test/en/searchResult?param=test ----- Valid url

https://myhost.test/en/searchResult?param=<h1>    ----- return 404

Ich habe es unten versucht, aber es funktioniert nicht

   error_page 420 = @blockUrl;
   location ~ ^/(en)/search {
     if ($args ~* "q=<") {
        return 420;
     }
  }
 location @blockUrl{
    return 404;
 }

Kann mir bitte jemand helfen, wie ich das Vorhandensein von „<“ im Abfrageparameter blockieren kann?

Antwort1

In meinen Tests war die URL immer verschlüsselt in der Protokolldatei, egal wie ich sie eingegeben habe (kodiert oder nicht).
Hier sind zwei Möglichkeiten, um Ihre Anforderung zu erfüllen:

if ($args ~* (param=.*(%3C|%3E).*)) {
   return 404;
}

oder

In Ihrem locationBlock:

if ($err404) {
   return 404;
}

Im httpBlock (nicht innerhalb des serverBlocks!):

map $args $err404 {
        ~param=.*(%3C|%3E).*            1;
        default                         0;
}

verwandte Informationen