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


10

현재 일부 오류 페이지 및 기타 "기본"미디어 파일 (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 :

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

답변:


10

나는 내 원래 생각에 훨씬 더 가까운 무언가로 가고 결국. 내가 빠진 열쇠는 지시문으로 밝혀졌습니다 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을하지 않도록합니다.


이것은 훌륭하게 작동하지만 (예 : 404 / POST 조합) HTTP 오류 코드를 삼키고 200을 보내는 것 같습니다 ... 나와 같은 동작이 있습니까?
10

2
대신 제거 log_not_found off;하고 추가 할 수 있습니다 internal;.
Alix Axel

POST 요청에서 오류가 발생한 문제는 nginx의 이상한 동작입니다. trac.nginx.org/nginx/ticket/824
Robo

5

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

예, 정확히 내가 필요한 것입니다. try_files를 사용해 보았지만 귀하의 답변으로 특별한 내부 위치를 만들어야한다는 것을 알게되었습니다. 나에게 맞는 구성을 보여주기 위해 내 대답을 편집했습니다.이 구성은 제안한 것과 약간 조정되었습니다.
Jim D

위의 편집 2를 참조하십시오. 내가 알 수 있듯이이 제안은 POST 요청에는 작동하지 않습니다. try_files는 원래 요청의 요청 메소드를 사용하므로 결국 405 Not Allowed 응답이 발생합니다.
Jim D

@JimD :이 방법을 정확하게 사용하지 않고 수정 된 방법을 사용합니다. 이것은 나를 위해 작동합니다. 0.8.x보다 오래된 Nginx 바이너리를 업그레이드하십시오
Martin Fjordvald

글쎄, 문제는 404 이상을 위해 이것을 사용하고 있기 때문에 위치 대신 error_page-> location-> try_files-> try_files-> location-> try_files 대신해야합니다. 그러나 패키지의 0.7.x 바이너리에 있으므로 소스에서 빌드하여 문제가 해결되는지 확인합니다.
Jim D

2

불행히도 나는 대답에 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;
}

}

1
잘 사용 internal합니다.
클린트 Pachl

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.