Nginx의 proxy_intercept_errors 지시문이 제대로 작동하기 위해 다시 쓰기가 필요한 이유는 무엇입니까?


8

다음은 샘플 Nginx 서버 구성입니다. "매직 부적"위치 블록이 없으면 프록시 된 오류 컨텐츠로 인해 사용자 정의 된 오류 페이지가 아닌 Nginx 404 페이지가 생성됩니다.

proxy_intercept_errors 지시문을 제거하면 올바른 http 오류 코드 헤더가있는 적절한 프록시 오류 페이지가 제공됩니다.

마법 부적의 존재 여부에 관계없이 프록시되지 않은 오류 페이지가 올바르게 렌더링됩니다.

정확히 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?

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

답변:


4

이 답변이 현재 v1.8.1 안정 버전으로 늦게 시작되어 죄송합니다. 제공 한 구성은 부적 없이 작동해야합니다 .

실험중인 버전을 제공 한 경우 버그가 수정되었는지 또는 구성에 결함이 있는지 확인하는 것이 좋습니다.

/admin/위치 또는 포함 된 rewrite지시문 이 필요하지 않으므로 구성을 다시 확인하는 것이 좋습니다 . 방해 할 수 있으므로이 테스트에 포함되지 않은 (및 표시하지 않은) 모든 항목을 제거 할 때 특히주의하십시오.

최후의 수단으로 다음과 같이 성공적으로 테스트하고 구성 스 니펫을 작성하고 변경 사항을 천천히 통합하고 결과가 예상과 다른 지점을 확인할 수 있습니다.

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

고마워, 버나드 원래 질문이 제기되었을 때 어떤 Nginx 버전을 테스트했는지 더 이상 기억하지 못하는 충분한 시간이 지났으므로 귀하의 답변을 수락 된 것으로 표시하고 있습니다.
Aubrey Falconer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.