Nginx - redireciona o antigo .php? id =… para o URL amigável de SEO não redireciona como esperado

2

Estou migrando um website com URLs /category.php?id=4 de estilo antigo para URLs / category / seo-friendly-slug.

rewrite ^/category.php?id=1$ /styles-de-bieres-belges/pils permanent;
rewrite ^/category.php?id=2$ /styles-de-bieres-belges/bieres-blanches permanent;
rewrite ^/category.php?id=4$ /styles-de-bieres-belges/lambics-et-gueuzes permanent;
rewrite ^/category.php?id=5$ /styles-de-bieres-belges/ales-stouts-et-ipa permanent;
rewrite ^/category.php?id=6$ /styles-de-bieres-belges/bieres-trappistes permanent;
rewrite ^/category.php?id=7$ /styles-de-bieres-belges/bieres-d-abbaye permanent;
rewrite ^/category.php?id=8$ /styles-de-bieres-belges/bieres-rouges-des-flandres permanent;
rewrite ^/category.php?id=9$ /styles-de-bieres-belges/lambics-et-gueuzes permanent;
rewrite ^/category.php?id=11$ /styles-de-bieres-belges/bieres-fruitees permanent;
rewrite ^/category.php$ /styles-de-bieres-belges permanent;

Mas todas as solicitações '/category.php?id=...' redirecionam para /styles-de-bieres-belges (a última linha). Se eu remover esta última linha, ela não redireciona nada.

O que há de errado com essa configuração?

    
por Michael Hulet 12.12.2014 / 23:44

2 respostas

3

Pare de usar esses ifs ou todo esse conjunto de reescritas com URIs semelhantes. Isso será mais fácil de ler e manter. Isso também evitará um impacto no desempenho, pois as regexs de regras de reescrita são testadas sequencialmente.

Use um mapa :

map $arg_id $target {
    "1"  "pils";
    "2"  "bieres-blanches";
    "4"  "lambics-et-gueuzes";
    "5"  "ales-stouts-et-ipa";
    "6"  "bieres-trappistes";
    "7"  "bieres-d-abbaye";
    "8"  "bieres-rouges-des-flandres";
    "9"  "lambics-et-gueuzes";
    "11" "bieres-fruitees";
}

server {

    ...

    location /category {
        rewrite ^/category.php$ /styles-de-bieres-belges/$target? permanent;
    }

}
    
por 13.12.2014 / 20:34
2

As strings de consulta são convertidas em variáveis nas regras de reescrita e removidas. Para o seu exemplo, todo o mecanismo de reescrita vê é category.php , mas os valores armazenados para $arg_id .

Tente algo assim:

location = /category.php {
if ($arg_id = "1") {rewrite ^ /styles-de-bieres-belges/pils permanent;}
if ($arg_id = "2") {rewrite ^ /styles-de-bieres-belges/bieres-blanches permanent;}

... the rest of them ...

if ($arg_id !~ "^\d+$") {rewrite ^ /styles-de-bieres-belges permanent;}
}
    
por 13.12.2014 / 00:01