Nginx bir yolu diğerine yönlendirir


51

Bundan daha önce sorulduğundan eminim, ama işe yarayacak bir çözüm bulamıyorum.

Bir web sitesi CMS hizmetlerini değiştirdi, ancak aynı etki alanına sahip, tek bir sayfa için nginx yeniden yazma özelliğini nasıl ayarlarım?

Örneğin

Eski Sayfa

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

Yeni sayfa

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

Lütfen dikkat , içerik sayfasındaki her şeyin yönlendirilmesini istemiyorum ama kelimenin tam anlamıyla yukarıda belirtilen URL’yi. Kurulacak 9 yönlendirme var, bunlardan hiçbiri bir kalıba uymuyor.

Teşekkürler!

Düzenleme: Bir eğik çizgi olmadan yönlendirmesi dışında, çalışıyor gibi görünen bu çözümü buldum:

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

Ancak bu yönlendirir:

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

Yanıtlar:


87

Tuzaklar ve Yaygın Hatalardan doğrudan alıntı : Vergilendirme Yeniden Yazma :

Return direktifini kullanarak düzenli ifadelerin değerlendirilmesini tamamen önleyebiliriz.

Kalıcı yönlendirmeler returnyerine lütfen kullanın rewrite. İşte bu kullanım davasına yaklaşımım ...

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

1
Kesinlikle daha okunaklı. Bu, asıl URL’deki sorguları da koruyacak mı?
SteveEdson

1
Hayır! Olmayacak. Kalıcı yönlendirmelerle ilgili sorguları gerçekten tutmak istiyorsanız, şu küçük numaraya bakın ... gist.github.com/pothi/7152399
Pothi Kalimuthu

1
ifNginx'te ifadeleri kullanmanın kötü olduğunu düşünmekte haklı mıyım ? Bu hala yeniden yazma yöntemini kullanmaktan daha iyi bir uygulama olabilir mi?
SteveEdson

1
ifDönüş yönergesi ile birlikte kullanmak tamamen iyidir. Bakınız wiki.nginx.org/IfIsEvil . Evet, IMO, yeniden yazma kullanmaktan daha iyi.
Pothi Kalimuthu

13

İdeal olarak eğer bunu önleyebilirsiniz eğer ifadeler kullanmamalısınız. Böyle bir şey işe yarayabilir (denenmemiş).

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

1
Bu içerik dizinindeki her şeyi yakalamaz mı? Sadece bireysel öğeyi yönlendirmek istiyorum. Örneğin, içerik dizininde başka bir
öğem var

1
Çözdüm. Doğru yönlendirdiğini çıkıyor, ancak komut dosyası isabetli URL'yi yönetiyordu.
SteveEdson

1
Ah, soruyu yanlış anladım. Sadece içerik kısmının değişmesini istediğini sanıyordum. İlke aynı kalır. Sizin için çalışmasına sevindim.
Gevious

1
Sorun değil, yardım için teşekkürler, gelecekte kesinlikle kullanmam gerekecek.
SteveEdson

12

Aşağıdaki çözümü kullandım:

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

Bir tedavi çalışır.


8

Benim için böyle bir eşittir işareti olmadan çalıştı:

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

2
Konum bloğuna hiç ihtiyacınız yok. Sadece kullan rewrite. @ SteveEdison'un cevabına bakınız.
PKHunter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.