Tôi đang định cấu hình xử lý nginx của một số trang lỗi và các tệp phương tiện "mặc định" khác (chẳng hạn như favicon.ico và robot.txt) vào lúc này và tôi gặp phải một vấn đề nhỏ khiến mọi thứ hoạt động theo cách tôi muốn cho một số trang lỗi nhất định .
Về cơ bản, những gì tôi đang cố gắng làm là phục vụ một số tệp nhất định cho một máy chủ dưới quyền root cho máy chủ đó, ví dụ: /var/www/someserver.com/robots.txt. Nếu tệp đó không tồn tại, tôi muốn nginx đi đến "mặc định", tức là /var/www/default/robots.txt. Đây là ý chính cơ bản về cách tôi đã cấu hình (thành công):
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Điều đó làm việc tuyệt vời.
Tôi đang cố gắng làm điều tương tự cho các trang lỗi và tôi không thể làm điều đó xảy ra:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Lưu ý rằng "hoạt động" này theo nghĩa là nếu bạn truy cập someserver.com/404.html, trước tiên, nó sẽ cố tải /var/www/someserver.com/404.html và sau đó quay lại / var / www / default /404.html nếu không tìm thấy. Tuy nhiên, nếu bạn truy cập someserver.com/blahblah, nó chỉ hiển thị trang 404 nếu được đặt trong /var/www/someserver.com/. Nó không rơi trở lại thư mục mặc định nếu tập tin đó không tồn tại.
Dù sao đi nữa, bạn có thể có thể những gì tôi đã cố gắng thực hiện (đó là lý do tại sao tôi bao gồm ví dụ làm việc đầu tiên).
Có ý kiến gì không?
Biên tập:
Dựa trên câu trả lời của Martin F, đây là những gì tôi đã kết hợp lại với nhau:
# 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;
}
}
Điều này làm việc tuyệt vời. Khối error_pages và vị trí thực tế ở trên nằm trong tệp server_defaults.conf được bao gồm với mọi máy chủ ảo, đó là lý do tại sao tôi không mã hóa đường dẫn vào từng vị trí và sử dụng đường dẫn tương đối cho các mặc định.
Chỉnh sửa 2:
Cách tiếp cận này có một vấn đề. Nếu bạn POST đến một URL trả về lỗi, phương thức yêu cầu POST sẽ được gửi với các lần thử try_files. Điều này (đối với tôi) dẫn đến lỗi 405 Không được phép, vì về cơ bản nginx đang cố gắng POST để ví dụ /default/500.html thay vì chỉ nhận trang đó.
Chỉnh sửa 3:
Tôi đã đăng một giải pháp hoạt động gần với ý tưởng ban đầu của tôi hơn.