nginx url viết lại: sự khác biệt giữa nghỉ và cuối


45

Tôi không hiểu sự khác biệt giữa nghỉ và cuối (cờ viết lại). Các tài liệu khá trừu tượng. Tôi đã cố gắng chuyển đổi giữa hai trong một số cấu hình của mình, nhưng tôi không thể phát hiện ra bất kỳ sự khác biệt nào trong hành vi. Ai đó có thể vui lòng giải thích những lá cờ chi tiết hơn? Tốt nhất là với một ví dụ cho thấy hành vi khác nhau khi lật cờ này sang cờ khác.


Tôi không biết câu trả lời, nhưng vui lòng cập nhật wiki.nginx.org khi bạn nhận được câu trả lời. Ngoài ra, danh sách gửi thư nginx bằng tiếng Anh khá tích cực và Igor (nhà phát triển chính) trả lời hàng trăm câu hỏi mỗi tháng, vì vậy có lẽ nên hỏi ở đó.
rmalayter

@rmalayter - câu hỏi này đã được hỏi trong danh sách gửi thư nginx. Igor đã trả lời nhưng câu trả lời cũng không có ý nghĩa lắm đối với tôi: pubbs.net/nginx/200908/46047

Liên kết pubbs.net bị hỏng khi tên miền đã được sử dụng. Xin lỗi, đã không thể tìm thấy nơi nó nên chỉ. ; (
Tino

Câu trả lời:


40

Bạn có thể có các bộ quy tắc viết lại khác nhau cho các vị trí khác nhau. Khi mô-đun viết lại đáp ứng last, nó dừng xử lý bộ hiện tại và yêu cầu viết lại được truyền lại một lần nữa để tìm vị trí thích hợp (và bộ quy tắc viết lại mới). Nếu quy tắc kết thúc break, việc viết lại cũng dừng lại, nhưng yêu cầu viết lại không được chuyển đến một vị trí khác.

Đó là, nếu có hai vị trí: loc1 và loc2 và có một quy tắc viết lại trong loc1 thay đổi loc1 thành loc2 VÀ kết thúc bằng last, yêu cầu sẽ được viết lại và chuyển đến vị trí loc2. Nếu quy tắc kết thúc bằng break, nó sẽ thuộc về vị trí loc1.


Bạn có nghĩa là nếu viết lại có cờ ngắt, nó sẽ không tìm kiếm một khối vị trí phù hợp, do đó làm cho nó thuộc về vị trí loc1.
Martin Fjordvald

Chính xác. Đã sửa.
minaev

43

OP thích một ví dụ. Ngoài ra, những gì @minaev viết, chỉ là một phần của câu chuyện! Vì vậy, ở đây chúng tôi đi ...

Ví dụ 1: Không có cờ (ngắt hoặc cuối)

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

Kết quả:

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

Giải trình:

Đối với rewrite, các cờ là tùy chọn!

Ví dụ 2: Khối vị trí bên ngoài (ngắt hoặc cuối)

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
}

Kết quả:

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

Giải trình:

Bên ngoài khối vị trí, cả hai breaklastcư xử theo cách chính xác ...

  • không phân tích cú pháp các điều kiện viết lại
  • Công cụ nội bộ Nginx chuyển sang giai đoạn tiếp theo (tìm kiếm locationkết quả khớp)

Ví dụ 3: Khối vị trí bên trong - "phá vỡ"

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

Kết quả:

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

Giải trình:

Trong một khối vị trí, breakcờ sẽ làm như sau ...

  • không phân tích cú pháp các điều kiện viết lại
  • Động cơ nội bộ Nginx tiếp tục phân tích locationkhối hiện tại

Ví dụ 4: Khối vị trí bên trong - "cuối cùng"

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

Kết quả:

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

Giải trình:

Trong một khối vị trí, lastcờ sẽ làm như sau ...

  • không phân tích cú pháp các điều kiện viết lại
  • Công cụ nội bộ Nginx bắt đầu tìm kiếm một vị trí phù hợp khác dựa trên kết quả của rewritekết quả.
  • không phân tích cú pháp các điều kiện viết lại, ngay cả trên vị trí phù hợp tiếp theo!

Tóm lược:

  • Khi một rewriteđiều kiện với cờ breakhoặc lastkhớp, Nginx ngừng phân tích cú pháp nữa rewrites!
  • Bên ngoài một khối vị trí, với breakhoặc last, Nginx thực hiện cùng một công việc (dừng xử lý các điều kiện viết lại nữa).
  • Bên trong một khối vị trí, với break, Nginx chỉ dừng xử lý các điều kiện ghi lại nữa
  • Bên trong một khối vị trí, với last, Nginx dừng xử lý lại các điều kiện viết lại và sau đó bắt đầu tìm kiếm một locationkhối khớp mới ! Nginx cũng bỏ qua bất kỳ rewritestrong locationkhối mới !

Lưu ý cuối cùng:

Tôi đã bỏ lỡ để bao gồm một số trường hợp cạnh hơn (thực sự vấn đề phổ biến với viết lại, chẳng hạn như 500 internal error). Nhưng, điều đó nằm ngoài phạm vi của câu hỏi này. Có lẽ, ví dụ 1 cũng nằm ngoài phạm vi!


LỖI : "nginx.service thất bại vì quá trình kiểm soát đã thoát với mã lỗi." ... chỉ thị không rõ "echo"
Peter Krauss

nginx.com/resource/wiki/modules/echo . Một số bản phân phối Linux như Ubuntu 14.04 trở đi gói mô-đun này trong một số gói nhất định (chẳng hạn như trong nginx-bổ sung). Tôi hy vọng điều đó sẽ giúp.
Pothi Kalimuthu

1
Trong ví dụ 1, nó có tạo ra sự khác biệt nếu quy tắc viết lại được đặt phía trên cả ba chỉ thị vị trí không?
Craig Hicks

1
@CraigHicks Không, nó sẽ không. Một quy tắc viết lại có quyền ưu tiên cao hơn và được thực thi đầu tiên trước khi các vị trí được khớp.
Pothi Kalimuthu

1
Đây phải là câu trả lời tốt nhất. Thật dễ hiểu khi tham khảo các ví dụ này và đọc tài liệu nginx.
Don Dilanga
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.