Puncte:0

Redirecționarea Nginx bazată pe șirul de interogare

drapel in

Migrez linkurile de site-uri vechi către site-uri noi, va folosi același domeniu

Iată câteva link-uri vechi.

Legături vechi Link-uri noi
http://example.com/?p=contact /a lua legatura
http://example.com/?p=static&id=career /Carieră
http://example.com/?p=static&id=about /despre
http://example.com/?p=catalog&action=images&cat_id=1 /product-category/category-slug-1
http://example.com/?p=catalog&action=images&cat_id=2 /product-category/category-slug-2
http://example.com/?p=catalog&action=viewimages&pid=1&cat_id=1 /product/product-slug-1
http://example.com/?p=catalog&action=viewimages&pid=2&cat_id=3 /product/product-slug-2

Noua pagină de produs nu are ID în URL, așa că le enumerez pe toate manual și sunt doar 5 categorii și 20 de pagini de produse în total.

Aceasta este ceea ce am încercat înainte să știu că imbricat dacă nu este acceptat.

Locație / {
    if ($arg_p = contact) { return 301 /contact; }
    dacă ($arg_p = static) { 
        if ($arg_id = carieră) { return 301 /career; }
        # alte pagini statice redirecționează către /despre
        return 301 /aproximativ;
    }

    if ($arg_p = catalog) {
        if ($arg_action = imagini) {
            if ($arg_cat_id = 1) { return 301 /product-category/category-slug-1; }
            if ($arg_cat_id = 2) { return 301 /product-category/category-slug-2; }
            Alte # categorii nelistate ar trebui să redirecționeze către /product-categories
            return 301 /categorii-produs;
        }
        dacă ($arg_action = vizualizați imagini) {
            if ($arg_pid = 1) { return 301 /product/product-slug-1/; }
            if ($arg_pid = 2) { return 301 /product/product-slug-2/; }
        }
        Alte # linkuri nelistate sunt implicite la /products
        returnare 301 /produse;
    }
}

Care ar trebui să fie configurația?

Puncte:2
drapel gr

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.

drapel in
Am primit `nginx: [emerg] directiva „map” nu este permisă aici`. Harta nu poate fi folosită în blocul `server`? Nu am acces pentru a modifica nginx în afara blocului `server`.
drapel in
Am găsit aceste întrebări https://stackoverflow.com/questions/27358804/, așa că cred că harta nu este o opțiune pentru mine. Este posibil să faceți doar rescrie (regex pentru parametrii de interogare vechi) (linkuri noi)? Nu înțeleg prea multe despre regex.
drapel in
Acesta este un truc frumos pentru a concata parametrii de interogare și pentru a le stoca ca variabilă.
Puncte:1
drapel in

Am ajuns cu această soluție.

Locație / {
  if ($arg_p = contact) { return 301 /contact; }
  if ($args ~ p=static&id=career) { return 301 /career; }
  if ($arg_p = static) { return 301 /about; }
  if ($args ~ p=catalog&action=images&cat_id=1) { return 301 /product-category/category-a; }
  if ($args ~ p=catalog&action=images&cat_id=2) { return 301 /product-category/category-b; }
  # și alt cat_id
  if ($args ~ p=catalog&action=viewimages&pid=1&cat_id=1) { return 301 /product/product-a; }
  if ($args ~ p=catalog&action=viewimages&pid=2&cat_id=1) { return 301 /product/product-b; }
  # și alte pid
  if ($arg_p = catalog) { return 301 /produs; } #other p=catalog este implicit /products
  try_files $uri $uri/ /index.php$is_args$args;
}

Funcționează, dar nu poate gestiona cazul în care ordinea parametrilor de interogare nu este scrisă mai jos, de ex. /?id=cariera&p=static (id și p sunt schimbate)

De asemenea cat_id în p=catalog&action=viewimages nu este folosit, dar când scot cat_id din reguli, p=catalog&action=viewimages&pid=10 redirecționează întotdeauna către p=catalog&action=viewimages&pid=1, așa că a trebuit să pun cat_id.

Dacă cineva a avut o idee mai bună să gestioneze ordinea dinamică pentru parametrii de interogare, nu ezitați să postați ca răspuns. Îl voi marca ca acceptat dacă funcționează.

EDITARE: Pentru parametrii dinamici de interogare a comenzii și mult mai curat dacă, vezi Răspunsul lui Ivan Shatsky

Ivan Shatsky avatar
drapel gr
Vezi actualizarea răspunsului meu.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.