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