O poți face cu mai multe înlănțuite Hartă
blocuri. Iată o idee:
harta $arg_p $url_p {
contact/contact;
static $url_id;
catalog $url_action;
# valoarea implicită va fi un șir gol
}
harta $arg_id $url_id {
cariera/cariera;
despre despre;
# alte pagini statice redirecționează către /despre
implicit /despre;
}
harta $arg_action $url_action {
imagini $url_cat_id;
vizualizați imagini $url_pid;
Alte # acțiuni nelistate sunt implicite la /products
implicit /produse;
}
harta $arg_cat_id $url_cat_id {
1 /categoria-produs/categoria-slug-1;
2 /categoria-produs/categoria-slug-2;
Alte # categorii nelistate ar trebui să redirecționeze către /product-categories
implicit /categorii-produs;
}
harta $arg_pid $url_pid {
1 /produs/produs-slug-1;
2 /produs/produs-slug-2;
Alte # produse nelistate sunt implicite la /products
implicit /produse;
}
Server {
asculta ...
numele serverului ...
...
if ($url_p) { # dacă variabila „$url_p” nu este un șir gol
returnează 301 $url_p;
}
Locație / {
...
}
...
}
niste Hartă
blocurile pot fi scurtate, de exemplu, să presupunem că aveți 3 pagini statice /Carieră
, /clienți
și pagina „implicit”. /despre
, 5 categorii și 45 de produse:
harta $arg_id $url_id {
~^(cariera|clienti)$ /$1;
implicit /despre;
}
harta $arg_cat_id $url_cat_id {
~^([1-5])$ /product-category/category-slug-$1;
implicit /categorii-produs;
}
harta $arg_pid $url_pid {
~^([1-9]|[1-3]\d|4[0-5])$ /product/product-slug-$1;
implicit /produse;
}
Actualizați
OP afirmă că nu poate folosi Hartă
directivă, deoarece nu are acces la configurația completă nginx, ci doar la Server
blocarea conținutului.În timp ce soluția anterioară este mult mai elegantă (și ar trebui să fie mai eficientă în ceea ce privește performanța), este posibil să faceți același lucru numai folosind dacă
blocuri:
if ($arg_p = contact) { return 301 /contact; }
if ($arg_p = static) { set $pagina static_$arg_id; }
if ($pagina = static_career) { return 301 /career; }
if ($pagina) { return 301 /despre; } # orice lucru care nu este „careră” redirecționat către „/despre”
if ($arg_p = catalog) { set $action $arg_action; }
if ($action = imagini) { set $page category_$arg_cat_id; }
if ($pagina = categorie_1) { return 301 /product-category/category-a; }
if ($pagina = categorie_2) { return 301 /product-category/category-b; }
# ... alte categorii
if ($action = imagini) { return 301 /product-categories; } # categorie nelistată specificată
if ($action = viewimagini) { set $page product_$arg_pid; }
if ($pagina = produs_1) { return 301 /produs/produs-a; }
if ($pagina = produs_2) { return 301 /produs/produs-b; }
# ... alte produse
if ($acțiune = vizualizați imagini) { return 301 /produs; } # produs nelistat specificat
# dacă doriți să procesați orice acțiune nelistată într-un mod special
# if ($action) { ... } # argumentul de interogare „acțiune” nici „imagini”, nici „vizualizare imagini”
Acest fragment poate fi plasat fie în Server
sau Locație
context.