Para gerenciar redirecionamentos complexos, principalmente quando strings de consulta estão envolvidas, a diretiva map pode ser usada.
Você não pode corresponder a string de consulta (nada do ? em diante) às expressões location e rewrite , pois ela não faz parte do URI normalizado, mas a $request_uri contém a solicitação original completa string de consulta.
A correspondência do $request_uri pode ser problemática se os parâmetros não forem enviados em uma ordem consistente, também os URIs contendo caracteres estranhos serão codificados em porcentagem.
A diretiva map pode corresponder strings e / ou expressões regulares. Consulte este documento para obter detalhes.
Por exemplo:
map $request_uri $redirect {
default 0;
~*^/index\.php\?(?<suffix>(forums|threads|users).*)$ /f/$suffix;
...
}
server {
...
if ($redirect) {
return 301 $redirect;
}
...
}
Sempre use capturas nomeadas em uma expressão regular map block. A expressão mapeada é avaliada na instrução return . Pelo que entendi, toda vez que nginx encontra uma instrução contendo uma expressão regular (como rewrite , alguns location blocos e algumas if declarações), as capturas numéricas são redefinidas . O uso de capturas nomeadas garante que elas permaneçam no escopo na instrução return .
Consulte esta advertência sobre o uso de if .