Nginx에서 폴백 오류 페이지를 설정하는 방법은 무엇입니까? {

현재 일부 오류 페이지 및 기타 “기본”미디어 파일 (favicon.ico 및 robots.txt 등)을 nginx에서 처리하도록 구성하고 있으며 특정 오류 페이지에 대해 원하는 방식으로 작동하는 사소한 문제가 발생했습니다. .

기본적으로 내가하려고하는 것은 해당 서버의 루트 아래에있는 서버의 특정 파일을 제공하는 것입니다 (예 : /var/www/someserver.com/robots.txt). 해당 파일이 없으면 nginx가 “default”(예 : /var/www/default/robots.txt)로 이동합니다. 이것이 내가 (성공적으로) 구성한 방법의 기본 요지입니다.

server {
    ...
    root /var/www/someserver.com;

    location ~* ^/(robots\.txt)$ {
        error_page 404 = @default;
    }

    location @default {
        root /var/www/default;
    }
}

잘 작동합니다.

오류 페이지에 대해 동일한 작업을 시도하고 있지만 그렇게 할 수는 없습니다.

server {
    ...
    root /var/www/someserver.com;

    error_page 404   /404.html;

    location ~* ^/(404\.html)$ {
        error_page 404 = @default;
    }

    location @default {
        root /var/www/default;
    }
}

someserver.com/404.html을 방문하면 먼저 /var/www/someserver.com/404.html을로드 한 다음 / var / www / default로 돌아갑니다. 찾을 수없는 경우 /404.html 그러나 someserver.com/blahblah를 방문하면 /var/www/someserver.com/에 설정된 경우 404 페이지 만 표시됩니다. 해당 파일이 없으면 기본 디렉토리로 돌아 가지 않습니다.

어쨌든, 당신은 아마 내가 성취하려고했던 것을 할 수 있습니다 (그래서 첫 번째 작업 예제를 포함 시켰습니다).

어떤 아이디어?

편집하다:

Martin F의 대답에 따르면, 이것이 내가 함께 모은 결과입니다.

# Doesn't work when error page is returned on a POST request
server {
    ...
    root /var/www/someserver.com;

    error_page  404         = @notfound;
    error_page  500 502 504 = @server_error;
    error_page  503         = @maintenance;

    location @notfound {
        try_files /404.html /../default/404.html =404;
    }

    location @server_error {
        try_files /500.html /../default/500.html =500;
    }

    location @maintenance {
        try_files /503.html /../default/503.html =503;
    }
}

이것은 훌륭하게 작동합니다. 위의 error_pages 및 위치의 실제 블록은 모든 가상 호스트에 포함되는 server_defaults.conf 파일에 있으므로 각 위치에 경로를 하드 코딩하지 않았고 기본값에 상대 경로를 사용했습니다.

편집 2 :

이 접근법에는 문제가 있습니다. 오류를 반환하는 URL에 POST하는 경우 try_files 시도와 함께 POST 요청 메서드가 전송됩니다. nginx가 본질적으로 해당 페이지를 가져 오는 대신 /default/500.html로 POST하려고 시도하기 때문에 405 Not Allowed 오류가 발생합니다.

편집 3 :

나는 원래 아이디어에 훨씬 가까운 솔루션을 게시했습니다.



답변

나는 내 원래 생각에 훨씬 더 가까운 무언가로 가고 결국. 내가 빠진 열쇠는 지시문으로 밝혀졌습니다 recursive_error_pages. 내가 정말로해야 할 일은 이것을 “켜기”만하면되고 원래의 아이디어는 효과가있었습니다. 내 conf의 관련 부분은 다음과 같습니다.

server {
    ...

    root /var/www/someserver.com/;

    error_page 400 404      /404.html;
    error_page 500 502 504  /500.html;
    error_page 503          /503.html;

    recursive_error_pages   on;

    location ~* ^/(404\.html|500\.html|503\.html)$ {
        log_not_found off;
        error_page 404 = @default;
    }

    location @default {
        log_not_found on;
        root /var/www/default;
    }
}

Martin F의 접근법에 어려움을 겪었 기 때문에 원래의 질문에 속하지 않은 다른 오류 유형을 여기에 포함 시켰습니다. log_not_found지시어는 오류 페이지가 원래의 루트에서 발견되지 않을 때 내 로그에 404을하지 않도록합니다.


답변

try_files 가 여기에가는 길입니다. 다음 구성은 작동하지만 구문 오류에 대해서는 테스트하지 않았습니다.

server {
    ...
    root /var/www;

    location / {
        try_files /someserver.com$uri /default$uri /someserver.com$uri/ /default$uri/ @notfound;
    }

    location @notfound {
       try_files /someserver/404.html /default/404.html =404; # =404 should make it use the nginx-default 404 page.
    }
}

답변

불행히도 나는 대답에 2 년 늦었지만 미래의 검색 자에게 도움이 될 것이라고 생각했습니다. 설치된 Nginx 버전은 1.2.4이며 다음 구성 스 니펫을 만들었습니다.

server {

server_name www.example.com
root /var/www/example


## Errors -> Locations
error_page   400 /400.html;
error_page   403 /403.html;
error_page   404 /404.html;
error_page   500 502 503 504 /50x.html;

## Locations -> Fallback
location = /400.html {
    try_files /400.html @error;
    internal;
}
location = /403.html {
    try_files /403.html @error;
    internal;
}
location = /404.html {
    try_files /404.html @error;
    internal;
}
location = /50x.html {
    try_files /50x.html @error;
    internal;
}

## Fallback Directory
location @error {
    root /var/www/error;
}

}

답변

“proxy_intercept_errors on”을 포함하는 것이 중요하다는 것을 알았습니다. error_page가 포함 된 모든 위치 블록에서

이 설정이 없으면 위치 블록은 업스트림에서 다시 오는 오류 코드를 차단합니다.

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors