nginx url yeniden yazma: mola ve son arasındaki fark


45

Mola ve son arasındaki farkı anlamıyorum (yeniden yazma bayrakları). Belgeler oldukça eksiktir. Bazı yapılandırmalarımda ikisi arasında geçiş yapmaya çalıştım, ancak davranışta herhangi bir fark bulamadım. Birisi lütfen bu bayrakları daha ayrıntılı olarak açıklayabilir mi? Tercihen, bir bayrağı diğerine çevirirken farklı davranış gösteren bir örnekle.


Cevabı bilmiyorum, ancak cevabınızı aldığınızda lütfen wiki.nginx.org adresini güncelleyin. Ayrıca, ingiliz dili nginx posta listesi oldukça aktiftir ve Igor (ana geliştirici) ayda yüzlerce soruyu yanıtlar, o yüzden belki de orada sorun.
rmalayter

@rmalayter - Bu soru nginx posta listesinde istendi. Igor cevapladı ama cevap bana da mantıklı gelmedi: pubbs.net/nginx/200908/46047

Alan devralındığında pubbs.net bağlantısı koptu. Üzgünüz, nereye bakması gerektiğini bulamadı. ; (
Tino

Yanıtlar:


40

Farklı yerler için farklı yeniden yazma kuralları kümeniz olabilir. Yeniden yazma modülü karşıladığında last, geçerli kümeyi işlemeyi durdurur ve yeniden yazılan istek, uygun yeri (ve yeni yeniden yazma kuralları kümesini) bulmak için bir kez daha iletilir. Kural sona ererse break, yeniden yazma da durur, ancak yeniden yazılmış istek başka bir konuma iletilmez.

Yani, iki konum varsa: loc1 ve loc2 ve loc1'de loc1'i loc2'ye değiştiren AND ile biten bir yeniden yazma kuralı varsa lastistek yeniden yazılır ve loc2'ye iletilir. breakKuralla sona ererse , konum loc1'e ait olacaktır.


Yeniden yazmanın sonu bayrağını varsa, eşleşen bir konum bloğu aramaz, böylece konum loc1'e aittir.
Martin Fjordvald

Kesinlikle. Sabit.
minaev

43

OP bir örneği tercih etti. Ayrıca, @minaev'in yazdığı şey, hikayenin sadece bir parçasıydı! İşte başlıyoruz.

Örnek 1: Hayır (ara veya son) bayrak

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
    }

    location /notes {
        echo 'finally matched location /notes';
    }

    location /documents {
        echo 'finally matched location /documents';
    }

    rewrite ^/([^/]+.txt)$ /notes/$1;
    rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}

Sonuç:

# curl example.com/test.txt
finally matched location /documents

Açıklama:

İçin rewrite, bayraklar isteğe bağlıdır!

Örnek 2: Dış konum bloğu (ara veya son)

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
    }

    location /notes {
        echo 'finally matched location /notes';
    }

    location /documents {
        echo 'finally matched location /documents';
    }

    rewrite ^/([^/]+.txt)$ /notes/$1 break; # or last
    rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}

Sonuç:

# curl example.com/test.txt
finally matched location /notes

Açıklama:

Konum bloğunun dışında, her ikisi de breakve lastaynı şekilde davranın ...

  • artık yeniden yazma koşullarının ayrıştırılması yok
  • Nginx iç motoru bir sonraki aşamaya gider ( locationeşleşme aranıyor)

Örnek 3: İç konum bloğu - "break"

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
        rewrite ^/([^/]+.txt)$ /notes/$1 break;
        rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
    }

    location /notes {
        echo 'finally matched location /notes';
    }

    location /documents {
        echo 'finally matched location /documents';
    }
}

Sonuç:

# curl example.com/test.txt
finally matched location /

Açıklama:

Bir konum bloğunun içinde breakbayrak aşağıdakileri yapar ...

  • artık yeniden yazma koşullarının ayrıştırılması yok
  • Nginx dahili motor mevcut locationbloğu ayrıştırmaya devam ediyor

Örnek 4: İç konum bloğu - "son"

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
        rewrite ^/([^/]+.txt)$ /notes/$1 last;
        rewrite ^/notes/([^/]+.txt)$ /documents/$1;  # this is not parsed
    }

    location /notes {
        echo 'finally matched location /notes';
        rewrite ^/notes/([^/]+.txt)$ /documents/$1;  # this is not parsed, either!
    }

    location /documents {
        echo 'finally matched location /documents';
    }
}

Sonuç:

# curl example.com/test.txt
finally matched location /notes

Açıklama:

Bir konum bloğunun içinde lastbayrak aşağıdakileri yapar ...

  • artık yeniden yazma koşullarının ayrıştırılması yok
  • Nginx dahili motoru , sonucun sonucuna göre başka bir yer eşleşmesi aramaya başlarrewrite .
  • bir dahaki konum maçında bile tekrar yazma koşullarının ayrıştırılması yok!

Özet:

  • rewriteBayrakla breakveya lasteşleşmeyle ilgili bir durum olduğunda , Nginx artık ayrıştırmayı durdurur rewrites!
  • Bir konum bloğu dışında breakveya last, Nginx aynı işi yapar (koşullara yeniden artık işlemeyi bırakır).
  • Bir konum bloğunun içinde break, Nginx yalnızca artık yeniden yazma koşullarını işlemeyi durdurur
  • Bir konum bloğunun içinde last, Nginx artık tekrar yazma koşullarını işlemeyi durdurur ve ardından yeni bir blok eşleşmesi aramaya başlarlocation ! Nginx ayrıca rewritesyeni locationbloktaki herkesi görmezden geliyor !

Son Not:

Bazı daha ileri vakaları dahil etmeyi özledim (aslında yeniden yazma ile ilgili sık görülen bir problem 500 internal error). Ancak bu, bu sorunun kapsamı dışında kalacaktı. Muhtemelen, örnek 1 de kapsam dışı!


HATA : "nginx.service başarısız oldu çünkü kontrol işlemi hata koduyla çıktı." ... bilinmeyen direktif "echo"
Peter Krauss

nginx.com/resources/wiki/modules/echo . Ubuntu 14.04 gibi bazı Linux dağıtımları bu modülü belirli paketlerde (örneğin, nginx-extras) paketler. Umarım bu yardımcı olur.
Pothi Kalimuthu

1
Örnek 1'de, yeniden yazma kurallarının üç konum direktifinin üstüne yerleştirilmesi fark yaratır mıydı?
Craig Hicks,

1
@CraigHicks Hayır, olmaz. Yeniden yazma kuralı daha yüksek önceliğe sahiptir ve ilk konumlar eşleştirilmeden önce uygulanır.
Pothi Kalimuthu

1
Bu en iyi cevap olmalı. Bu örneklere bakarak ve nginx belgelerini okuyarak anlaşılması kolaydır.
Don Dilanga
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.