Nginx reindirizza un percorso a un altro


51

Sono sicuro che questo è stato chiesto prima, ma non riesco a trovare una soluzione che funzioni.

Un sito Web ha cambiato i servizi CMS, ma ha lo stesso dominio, come faccio a impostare una riscrittura nginx per una singola pagina?

Per esempio

Vecchia pagina

http://sitedomain.co.uk/content/unique-page-name

Nuova pagina

http://sitedomain.co.uk/new-name/unique-page-name

Tieni presente che non desidero reindirizzare tutto all'interno della pagina dei contenuti, ma letteralmente solo l'URL di cui sopra. Ho circa 9 reindirizzamenti da configurare, non dei quali rientrano in uno schema.

Grazie!

Modifica: ho trovato questa soluzione, che sembra funzionare, tranne per il fatto che reindirizza senza una barra:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}

Ma questo reindirizza a:

http://sitedomain.co.uknew-name/unique-page-name/

Risposte:


87

Citazione diretta da insidie ​​e errori comuni: riscrittura fiscale :

Usando la direttiva return possiamo evitare completamente la valutazione dell'espressione regolare.

Si prega di utilizzare returninvece che rewriteper reindirizzamenti permanenti. Ecco il mio approccio a questo caso d'uso ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

1
È decisamente più leggibile. Ciò manterrà anche eventuali domande che si trovavano sull'URL originale?
SteveEdson,

1
No. Non lo farà. Se vuoi davvero conservare qualsiasi domanda sui reindirizzamenti permanenti, vedi questo piccolo trucco ... gist.github.com/pothi/7152399
Pothi Kalimuthu

1
Ho ragione nel pensare che usare le ifistruzioni in nginx sia male? Sarebbe comunque una pratica migliore rispetto all'utilizzo del metodo di riscrittura?
SteveEdson,

1
L'uso ifcon la direttiva di ritorno va benissimo. Vedi wiki.nginx.org/IfIsEvil . Sì, IMO, è meglio che usare la riscrittura.
Pothi Kalimuthu,

13

Idealmente non dovresti usare if istruzioni se puoi evitarlo. Qualcosa del genere potrebbe funzionare (non testato).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 

1
Non catturerebbe tutto nella directory dei contenuti? Voglio solo reindirizzare il singolo articolo. Ad esempio, ho un altro elemento nella directory dei contenuti, ma ho bisogno che lo reindirizzi a ... / another-new-name / unique-page-name2
SteveEdson,

1
L'ho risolto. Si scopre che reindirizza correttamente, ma lo script stava colpendo stava rovinando l'URL dopo.
SteveEdson,

1
Ah, ho frainteso la domanda. Pensavo volessi cambiare solo la parte del contenuto. Il principio rimane lo stesso. Sono contento che funzioni per te.
Gevious,

1
Nessun problema, grazie per l'aiuto, sicuramente dovrò utilizzarlo in futuro.
SteveEdson,

12

Ho usato la seguente soluzione:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/$2 permanent;

Funziona a meraviglia.


8

Per me ha funzionato senza il segno uguale in questo modo:

location /old-url {
  return 301 /new-url;
}

2
Non è necessario il blocco posizione. Basta usare rewrite. Vedi la risposta di @ SteveEdison.
PKHunter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.