현재 일부 오류 페이지 및 기타 "기본"미디어 파일 (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 :
나는 원래 아이디어에 훨씬 가까운 솔루션을 게시했습니다.