nginx url menulis ulang: perbedaan antara istirahat dan terakhir

45

Saya tidak mengerti perbedaan antara break dan last (flag of rewrite). Dokumentasinya agak musykil. Saya sudah mencoba untuk beralih di antara keduanya di beberapa konfigurasi saya, tetapi saya tidak dapat menemukan perbedaan dalam perilaku. Adakah yang bisa menjelaskan bendera-bendera ini lebih terinci? Lebih disukai dengan contoh yang menunjukkan perilaku yang berbeda ketika membalik satu bendera ke yang lain.


sumber
Saya tidak tahu jawabannya, tetapi silakan perbarui wiki.nginx.org ketika Anda mendapatkan jawaban Anda. Juga, milis nginx berbahasa Inggris cukup aktif, dan Igor (pengembang utama) menjawab ratusan pertanyaan per bulan, jadi mungkin bertanya di sana.
rmalayter
@rmalayter - pertanyaan ini ditanyakan pada milis nginx. Igor menjawabnya tetapi jawabannya juga tidak masuk akal bagi saya: pubbs.net/nginx/200908/46047
tautan pubbs.net rusak karena domain diambil alih. Maaf, tidak dapat menemukan ke mana harus menunjuk. ; (
Tino

Jawaban:

40

Anda mungkin memiliki set aturan penulisan ulang yang berbeda untuk lokasi yang berbeda. Ketika modul penulisan ulang bertemu last, ia berhenti memproses set saat ini dan permintaan ditulis ulang dilewatkan sekali lagi untuk menemukan lokasi yang sesuai (dan set aturan penulisan ulang yang baru). Jika aturan berakhir dengan break, penulisan ulang juga berhenti, tetapi permintaan yang ditulis ulang tidak diteruskan ke lokasi lain.

Yaitu, jika ada dua lokasi: loc1 dan loc2, dan ada aturan penulisan ulang di loc1 yang mengubah loc1 ke loc2 DAN diakhiri dengan last, permintaan akan ditulis ulang dan diteruskan ke lokasi loc2. Jika aturan berakhir dengan break, itu akan menjadi milik lokasi loc1.

minaev
sumber
Maksud Anda jika penulisan ulang memiliki bendera istirahat, itu tidak akan mencari blok lokasi yang cocok, sehingga menjadikannya milik lokasi loc1.
Martin Fjordvald
Persis. Tetap.
minaev
43

OP lebih suka contoh. Juga, apa yang ditulis @minaev, hanyalah sebagian dari cerita! Jadi, ini dia ...

Contoh 1: Tidak ada tanda (putus atau terakhir)

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;
}

Hasil:

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

Penjelasan:

Sebab rewrite, bendera itu opsional!

Contoh 2: Blok lokasi di luar (istirahat atau terakhir)

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
}

Hasil:

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

Penjelasan:

Di luar blok lokasi, keduanya breakdan lastberperilaku dengan cara yang tepat ...

  • tidak ada lagi penguraian kondisi penulisan ulang
  • Mesin internal Nginx pergi ke fase berikutnya (mencari locationkecocokan)

Contoh 3: Blok lokasi di dalam - "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';
    }
}

Hasil:

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

Penjelasan:

Di dalam blok lokasi, breakbendera akan melakukan hal berikut ...

  • tidak ada lagi penguraian kondisi penulisan ulang
  • Mesin internal Nginx terus mengurai locationblok saat ini

Contoh 4: Blok lokasi di dalam - "terakhir"

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';
    }
}

Hasil:

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

Penjelasan:

Di dalam blok lokasi, lastbendera akan melakukan hal berikut ...

  • tidak ada lagi penguraian kondisi penulisan ulang
  • Mesin internal Nginx mulai mencari kecocokan lokasi lain berdasarkan rewritehasil.
  • tidak ada lagi penguraian kondisi penulisan ulang, bahkan pada pencocokan lokasi berikutnya!

Ringkasan:

  • Ketika rewritekondisi dengan bendera breakatau lastpertandingan, Nginx berhenti mengurai lagi rewrites!
  • Di luar blok lokasi, dengan breakatau last, Nginx melakukan pekerjaan yang sama (berhenti memproses lagi kondisi penulisan ulang).
  • Di dalam blok lokasi, dengan break, Nginx hanya berhenti memproses lagi kondisi menulis ulang
  • Di dalam blok lokasi, dengan last, Nginx berhenti memproses lagi kondisi penulisan ulang dan kemudian mulai mencari pencocokan locationblok yang baru! Nginx juga mengabaikan semua yang ada rewritesdi locationblok baru !

Catatan Akhir:

Saya rindu untuk memasukkan beberapa kasus tepi (sebenarnya masalah umum dengan penulisan ulang, seperti 500 internal error). Tapi, itu akan keluar dari ruang lingkup pertanyaan ini. Mungkin, contoh 1 juga di luar jangkauan!

Pothi Kalimuthu
sumber
GALAT : "nginx.service gagal karena proses kontrol keluar dengan kode kesalahan." ... direktif tidak dikenal "echo"
Peter Krauss
nginx.com/resources/wiki/modules/echo . Beberapa distribusi Linux seperti Ubuntu 14.04 dan seterusnya bundel modul ini dalam paket tertentu (seperti di nginx-ekstra). Saya harap itu membantu.
Pothi Kalimuthu
1
Dalam contoh 1 apakah akan membuat perbedaan jika aturan penulisan ulang ditempatkan di atas ketiga arahan lokasi?
Craig Hicks
1
@CraigHicks Tidak, tidak akan. Aturan penulisan ulang memiliki prioritas lebih tinggi dan dijalankan terlebih dahulu sebelum lokasi dicocokkan.
Pothi Kalimuthu
1
Ini harus menjadi jawaban terbaik. Sangat mudah dipahami dengan merujuk pada contoh-contoh ini, dan membaca dokumentasi nginx.
Don Dilanga