Nginx - Redirecionamento baseado em parâmetros de string de consulta

Nginx - Redirecionamento baseado em parâmetros de string de consulta

Temos um problema um pouco complicado para resolver em nossa configuração nginx. Atualmente temos um software instalado em nossa raiz de documentos. Este software usa um único ponto de entrada (index.php) e strings de consulta para mostrar o conteúdo. URLs de exemplo são:

/index.php?forums/forum-name.1
/index.php?threads/thread-name.1
/index.php?users/user-name.1

Etc...

Agora, estamos movendo este software para um subdiretório /f/e instalando um novo software na raiz do documento. Este software TAMBÉM usa index.php (embora sem strings de consulta). Portanto, precisamos criar um conjunto de regras de reescrita para reescrever SOMENTE os URLs do software antigo. Ao mesmo tempo, também removeremos index.php dos URLs. Um conjunto de exemplos de mapeamentos é:

/index.php?forums/forum-name.1 --> /f/forums/forum-name.1
/index.php?threads/thread-name.1 --> /f/threads/thread-name.1
/index.php?users/user-name.1 --> /f/users/user-name.1

Então, basicamente, preciso redirecionar um determinado subconjunto de solicitações index.php (contendo apenas ?forums, ?threads, ?users, etc...), remover a parte index.php e enviar para o diretório /f/.

Eu brinquei com isso a manhã toda e simplesmente não consigo fazer funcionar como preciso.

Responder1

Para gerenciar redirecionamentos complexos, especialmente quando strings de consulta estão envolvidas, a mapdiretiva pode ser usada.

Você não pode corresponder a string de consulta (qualquer coisa a partir de ?agora) nas expressões locationand rewrite, pois ela não faz parte do URI normalizado; no entanto, $request_uricontém a solicitação original completa com a string de consulta.

A correspondência $request_uripode ser problemática se os parâmetros não forem enviados em uma ordem consistente e também os URIs contendo caracteres estranhos serão codificados em porcentagem.

A mapdiretiva pode corresponder a strings e/ou expressões regulares. Veresse documentopara detalhes.

Por exemplo:

map $request_uri $redirect {
    default                                               0;
    ~*^/index\.php\?(?<suffix>(forums|threads|users).*)$  /f/$suffix;
    ...
}

server {
    ...
    if ($redirect) {
        return 301 $redirect;
    }
    ...
}

Sempre usecapturas nomeadasem uma mapexpressão regular de bloco. A expressão mapeada é avaliada na returninstrução. Pelo que entendi, toda vez que nginxencontro uma declaração contendo umexpressão regular(como rewritealguns locationblocos e algumas ifinstruções), as capturas numéricas são redefinidas. Usandocapturas nomeadasgarante que eles permaneçam no escopo na returndeclaração.

Veresse cuidadosobre o uso de if.

informação relacionada