2009-06-21 36 views
43

Nginx + PHP (trên fastCGI) hoạt động tốt cho tôi. Khi tôi nhập một đường dẫn đến một tập tin PHP mà không tồn tại, thay vì nhận được trang lỗi 404 mặc định (mà đi kèm cho bất kỳ tập tin .html không hợp lệ), tôi chỉ nhận được một "Không có tập tin đầu vào được chỉ định."Nginx - Tùy chỉnh trang 404

Tôi làm cách nào để tùy chỉnh trang lỗi 404 này?

Trả lời

33

Bạn sử dụng thuộc tính error_page trong nginx config.

Ví dụ, nếu bạn có ý định thiết lập các trang lỗi 404-/404.html, sử dụng

error_page 404 /404.html; 

Thiết lập trang 500 lỗi để /500.html chỉ là dễ dàng như:

error_page 500 /500.html; 
+2

Mặc dù liên kết là OK và câu trả lời ít hoạt động mà không liên kết, nó có thể được hưởng lợi từ xây dựng bổ sung. – Paul

+0

@Paul Tôi 100% đồng ý với bạn về điều này, do đó tôi đã thêm một số ví dụ mã vào câu trả lời này ;-) –

101

Bạn có thể thiết lập một trang lỗi tùy chỉnh cho mỗi khối vị trí trong nginx.conf của bạn hoặc một trang lỗi chung cho toàn bộ trang.

Để chuyển hướng đến một đơn giản 404 trang không tìm thấy một vị trí cụ thể:

location /my_blog { 
    error_page 404 /blog_article_not_found.html; 
} 

Một trang web rộng 404 page:

server { 
    listen 80; 
    error_page 404 /website_page_not_found.html; 
    ... 

Bạn có thể thêm mã lỗi tiêu chuẩn với nhau để có một trang duy nhất đối với một số loại lỗi:

location /my_blog { 
    error_page 500 502 503 504 /server_error.html 
} 

Để chuyển hướng đến máy chủ hoàn toàn khác, hãy chọn g bạn đã có một máy chủ có tên server2 thượng nguồn theo quy định tại phần http của bạn:

upstream server2 { 
    server 10.0.0.1:80; 
} 
server { 
    location /my_blog { 
     error_page 404 @try_server2; 
    } 
    location @try_server2 { 
     proxy_pass http://server2; 
    } 

Các manual có thể cung cấp cho bạn biết thêm chi tiết, hoặc bạn có thể tìm kiếm google cho các điều khoản nginx.conf và error_page cho các ví dụ thực tế đời sống trên web.

+1

Bạn có biết liệu có thể sử dụng ký tự đại diện lỗi không? Một cái gì đó như 'error_page 50 * = /error_50x.html;'? –

+0

Không cho phép ký tự đại diện - trang wiki cho lệnh máy chủ này có tại đây http://wiki.nginx.org/NginxHttpCoreModule#error_page - cũng không cần thiết vì mã lỗi được xác định bởi giao thức HTTP không thay đổi rất thường xuyên. Xem http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html hoặc http://en.wikipedia.org/wiki/List_of_HTTP_status_codes để biết danh sách đầy đủ và tôi giả sử thêm bất kỳ số nào bạn thích nếu bạn nghĩ ở đó sẽ là mã tương lai cần thiết. –

+1

Cảm ơn. Hiện tại tôi có 3 quy tắc: '/ 403.html','/404.html' và '/ 5xx.html', tất cả đều chia sẻ cùng một' root' nhưng bằng cách nào đó nếu tôi chỉ định vị trí '~/(?: 40 [ 34] | 5xx) [.] Html $ 'nó sẽ hiển thị các trang lỗi nginx mặc định, tuy nhiên, nếu tôi sử dụng vị trí không phải regex, nó hoạt động. Bạn có bất kỳ ý tưởng tại sao điều đó xảy ra? –

27

Thông số "error_page" không đủ.

Giải pháp đơn giản nhất là

server{ 
    root /var/www/html; 
    location ~ \.php { 
     if (!-f $document_root/$fastcgi_script_name){ 
      return 404; 
     } 
     fastcgi_pass 127.0.0.1:9000; 
     include fastcgi_params.default; 
     fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
    } 

Bằng cách này, nếu bạn muốn Nginx để xử lý 404 trạng thái được các script PHP, bạn cần phải thêm

fastcgi_intercept_errors trên;

Ví dụ:

location ~ \.php { 
     #... 
     error_page 404 404.html; 
     fastcgi_intercept_errors on; 
    } 
+0

cảm ơn bạn rất nhiều vì đã đăng bài @Grigori này, tôi đã sử dụng mã của bạn ở trên để khắc phục vấn đề nginx của tôi quá –

+0

Còn không có tệp Php?!? –

+1

Hoàn hảo, 'fastcgi_intercept_errors on' chính xác là những gì tôi đang tìm kiếm. – wildpeaks

14

Những câu trả lời không còn khuyến cáo từ try_files hoạt động nhanh hơn so với if trong bối cảnh này. Chỉ cần thêm try_files trong khối vị trí php của bạn để kiểm tra nếu tập tin tồn tại, nếu không trả về một 404.

location ~ \.php { 
    try_files $uri =404; 
    ... 
} 
28

Hãy cẩn thận với cú pháp!Lớn Rùa sử dụng chúng thay thế cho nhau, nhưng:

error_page 404 = /404.html;

Sẽ trở lại trang 404.html với mã trạng thái 200 (vì = đã chuyển tiếp mà trang này)

error_page 404 /404.html;

Will trả lại trang 404.html với mã lỗi 404 (bản gốc).

https://serverfault.com/questions/295789/nginx-return-correct-headers-with-custom-error-documents

+1

Đây là một chi tiết quan trọng! –

+1

Và 2 năm sau, tôi đã sửa mã của mình. Cảm ơn dhr_p. :) –

Các vấn đề liên quan