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

2

Temos um problema 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 de /f/ e instalando um novo software na raiz do documento. Este software também usa index.php (No query strings, no entanto). Portanto, precisamos criar um conjunto de regras de regravação para SÓ reescrever as URLs do software antigo. Ao mesmo tempo, também removeremos o index.php das URLs. Um conjunto de mapeamentos de exemplo é:

/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, eu preciso redirecionar um certo subconjunto de solicitações index.php (contendo apenas? fóruns,? threads,? usuários, etc ...), então remova a parte index.php e envie para o / f / diretório.

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

    
por Kevin 09.09.2018 / 18:49

1 resposta

1

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 .

    
por 10.09.2018 / 09:37

Tags