Tại sao chỉ thị proxy_intercept_errors của Nginx yêu cầu viết lại để hoạt động đúng?


8

Sau đây là một cấu hình máy chủ Nginx mẫu. Nếu không có khối vị trí "bùa phép", nội dung lỗi được ủy nhiệm sẽ dẫn đến trang Nginx 404 thay vì trang lỗi tùy chỉnh được cung cấp.

Xóa chỉ thị proxy_intercept_errors phục vụ trang lỗi được ủy quyền thích hợp với các tiêu đề mã lỗi http thích hợp.

Các trang lỗi không được cung cấp được hiển thị đúng bất kể sự hiện diện của bùa phép.

Bất kỳ ý tưởng như chính xác những gì đang xảy ra?

server {
    server_name     mydomain.com "";
    listen          80;
    root            /var/www;
    error_page      400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
    proxy_intercept_errors on;

    location /proxy/ {
        proxy_read_timeout  60s;
        proxy_set_header    Host $host;
        proxy_pass          http://myservers;
    }

    location /test404/ {
        return 404;
    }

    location /admin/ {    # this line constitute a magical talisman that fixes proxied error interception(???)(!)
        rewrite ^(/admin)(.*)$ /admin$2 break;
    }
}

Câu trả lời:


4

Tôi xin lỗi vì câu trả lời này sẽ bị trễ, vì hiện tại, với phiên bản ổn định v1.8.1 hiện tại, cấu hình bạn cung cấp sẽ hoạt động mà không cần bất kỳ lá bùa nào .

Nếu bạn đã cung cấp phiên bản mà bạn đang thử nghiệm, sẽ là một ý tưởng để xem liệu một lỗi đã được sửa chữa hay nếu cấu hình bị lỗi.

Tôi khuyên bạn nên kiểm tra lại cấu hình của mình, vì bạn chắc chắn không cần /admin/vị trí này cũng như rewritechỉ thị có chứa nó . Hãy đặc biệt cẩn thận trong việc loại bỏ mọi thứ không phải là một phần của bài kiểm tra này (và bạn không hiển thị) vì nó có thể gây trở ngại.

Như một phương sách cuối cùng, bạn có thể thử cách sau, thử nghiệm thành công, đoạn cấu hình và từ từ tích hợp các thay đổi và xem kết quả điểm nào khác với kỳ vọng:

server {
    listen      80;
    listen      [::]:80;
    server_name example.org;

    location /proxy {
        return 418 "Host: $host, Connection: $http_connection";
    }
}

server {
    listen      80;
    listen      [::]:80;
    server_name example.com;

    root /var/ious/files;

    error_page 418 = /error_page.html;
    proxy_intercept_errors on;

    location /proxy {
        proxy_pass http://example.org;
    }
}

Cảm ơn, Bernard. Tôi đánh dấu câu trả lời của bạn là được chấp nhận vì đã đủ thời gian trôi qua mà tôi không còn nhớ phiên bản Nginx nào mà tôi đã thử nghiệm khi câu hỏi ban đầu được đặt ra.
Aubrey Falconer
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.