Nginx URL'yi yalnızca dosya varsa yeniden yazar


13

Bir kullanıcı eski bir görüntü url gitmeye çalışır, böylece Nginx için bir yeniden yazma kuralı yazmak gerekir:

/images/path/to/image.png

ve dosya mevcut değilse, şuraya yönlendirmeyi deneyin:

/website_images/path/to/image.png

SADECE resim yeni URL'de varsa, aksi takdirde 404 ile devam edin. Ana makinemizdeki Nginx sürümünde henüz try_files yok.

Yanıtlar:


19
location /images/ {
    if (-f $request_filename) {
        break;
    }

    rewrite ^/images/(.*) /new_images/$1 permanent;
}

Yine de, yükseltme yapmak veya daha iyi bir ana bilgisayar bulmak için ana makinenizi hatalandırmak isteyebilirsiniz.


Bu, her 404'te / new_images'a yönlendirilecek değil mi? New_images dosyasının var olduğunu bilmedikçe yeniden yazma yapmak istemiyorum
Jose Fernandez

Bu dosyanın var olup olmadığını kontrol eder ve bu test başarısız olursa new_images'a yönlendirir. Bundan sonra ne olacağı burada belirtilmemiştir.
tylerl

Korkarım seçeneğiniz nginx yazarları tarafından ortak tuzaklar olarak kabul edilir nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/…
riverfall

2
@riverfall Heh, bu sayfanın bir kısmını yazdım. Cevabım 8 yıl önce yazılmıştır, bu yüzden evet çiş biraz modası geçmiş, ancak orijinal soru özellikle ev sahiplerinin nginx'in son bir sürümünü sağlamadığını ve bu nedenle try_files'a erişemediklerini belirtti.
Martin Fjordvald

1
@ Guillaume86 Bu konuda endişe etmem, eğer bir + yeniden yazma tamamen güvenlidir ve bir dosya üzerinde tek bir STAT kontrolü çok hafiftir. Bakım modunu kontrol etmek için bir arka uç uygulamasına gitmekten çok daha hızlıdır.
Martin Fjordvald

6

Lütfen ifbir konum bloğunun içinde kullanmayın . Kötü şeyler olabilir.

location ~* ^/images/(.+)$ {
    root /www;
    try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}

$1 gerçekleştirmeye çalıştığınız şey için yapılmış olan try_files yönergesinde denenecek dosya adı olur.

Bu, VEYA, kontrol etmeden yeniden yaz. Bu görüntü orada değilse, yine de 404 alırsınız.


Bu cevap kesinlikle soruyu cevaplamasa da ("[hayır] try_files"), gelecekteki ziyaretçiler için bu cevap daha fazla oyu hak ediyor.
DerMike

5

Bunun gibi bir şey kullanabilirsiniz (özel durumunuz için denenmemiş):

location ^/images/(?<imgpath>.*)$ {

    set $no_old  0;
    set $yes_new 0;

    if (!-f $request_filename)
    {
        set $no_old 1;
    }

    if (-f ~* "^/new_path/$imgpath")
    {
        set $yes_new 1$no_old;
    }

    # replacement exists in the new path
    if ($yes_new = 11)
    {
        rewrite ^/images/(.*)$ /new_path/$1 permanent;
    }

    # no image in the new path!
    if ($yes_new = 01)
    {
        return 404;
    }
}

Temelde ifNginx içinde yuvalayamadığınız için iç içe ifadeler yazmanın alternatif bir yoludur . Bu "hack" ile ilgili resmi referans için buraya bakın .

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.