Nginx mengalihkan satu jalur ke yang lain

51

Saya yakin ini telah ditanyakan sebelumnya, tetapi saya tidak dapat menemukan solusi yang berfungsi.

Sebuah situs web telah mengganti layanan CMS, tetapi memiliki domain yang sama, bagaimana cara mengatur penulisan ulang nginx untuk satu halaman?

Misalnya

Halaman Lama

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

Halaman baru

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

Harap dicatat , saya tidak ingin semua yang ada di halaman konten dialihkan, tetapi secara harfiah hanya url yang disebutkan di atas. Saya memiliki sekitar 9 arahan ulang untuk diatur, yang tidak cocok untuk suatu pola.

Terima kasih!

Sunting: Saya menemukan solusi ini, yang tampaknya berfungsi, kecuali kenyataan bahwa itu dialihkan tanpa garis miring:

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

Tetapi ini mengarahkan ke:

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

SteveEdson
sumber

Jawaban:

87

Kutipan langsung dari Kesalahan dan Kesalahan Umum: Penulisan Ulang Pajak :

Dengan menggunakan arahan balik kita sepenuhnya dapat menghindari evaluasi ekspresi reguler.

Silakan gunakan returnalih-alih rewriteuntuk pengalihan permanen. Inilah pendekatan saya untuk kasus penggunaan ini ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Pothi Kalimuthu
sumber
1
Ini pasti lebih mudah dibaca. Apakah ini juga menyimpan pertanyaan yang ada di URL asli?
SteveEdson
1
Nggak. Tidak akan. Jika Anda benar-benar ingin mempertahankan kueri saat pengalihan permanen, lihat trik kecil ini ... gist.github.com/pothi/7152399
Pothi Kalimuthu
1
Apakah saya benar dalam berpikir bahwa menggunakan ifpernyataan di nginx itu buruk? Apakah ini masih lebih baik daripada menggunakan metode menulis ulang?
SteveEdson
1
Menggunakan ifbersama dengan arahan kembali baik-baik saja. Lihat wiki.nginx.org/IfIsEvil . Ya, IMO, lebih baik daripada menggunakan menulis ulang.
Pothi Kalimuthu
13

Idealnya Anda tidak boleh menggunakan pernyataan if jika Anda bisa menghindarinya. Sesuatu seperti ini bisa bekerja (belum diuji).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 
Gevious
sumber
1
Bukankah itu akan menangkap semuanya dalam direktori konten? Saya hanya ingin mengarahkan item individual. Misalnya, saya memiliki item lain di direktori konten, tetapi saya memerlukannya untuk mengarahkan kembali ke ... / another-new-name / unique-page-name2
SteveEdson
1
Saya sudah memecahkannya. Ternyata itu mengarahkan ulang dengan benar, tetapi skrip yang dipukul telah merusak URL setelahnya.
SteveEdson
1
Ah, saya salah paham pertanyaannya. Saya pikir Anda hanya ingin bagian kontennya berubah. Prinsipnya tetap sama. Saya senang ini bekerja untuk Anda.
Gevious
1
Tidak masalah, terima kasih atas bantuannya, saya pasti akan perlu menggunakannya di masa depan.
SteveEdson
12

Saya menggunakan solusi berikut:

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

Berhasil.

SteveEdson
sumber
8

Bagi saya itu bekerja tanpa tanda sama dengan seperti ini:

location /old-url {
  return 301 /new-url;
}
primetimejas
sumber
2
Anda tidak memerlukan blok lokasi sama sekali. Gunakan saja rewrite. Lihat jawaban @ SteveEdison.
PKHunter