nginx retorna 404 se o parâmetro de consulta contém caractere especial '

nginx retorna 404 se o parâmetro de consulta contém caractere especial '

eu tenho urlhttps://myhost.test/en/searchResult?param=<

Quero retornar 404 se o parâmetro de consulta tiver caractere especial '<'

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

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

Tentei abaixo mas não funcionou

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

Alguém poderia me ajudar como bloquear '<' no parâmetro de consulta.

Responder1

Nos meus testes não importa como eu inseri a url (codificada ou não) ela sempre está codificada no arquivo de log.
Aqui estão duas possibilidades para atender sua exigência:

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

ou

No seu locationbloco:

if ($err404) {
   return 404;
}

No httpbloco (não dentro do serverbloco!):

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

informação relacionada