2010-05-04 81 views
18

Tại sao gần như mọi ví dụ tôi có thể tìm thấy (bao gồm this question từ khoảng một năm trước) nói rằng tiêu đề 404 phải là HTTP/1.0 404 Not Found khi chúng tôi thực sự sử dụng HTTP 1.1 trong hơn một thập kỷ? Có lý do nào để không gửi HTTP/1.1 404 Not Found thay thế không?tiêu đề 404 - HTTP 1.0 hoặc 1.1?

(Không phải là nó quan trọng tất cả những gì nhiều ... Tôi chủ yếu chỉ tò mò.)

+0

Khoảng 11 triệu kết quả của Google cho '1.0', khoảng 4,3 triệu kết quả cho' 1,1'. Tôi đoán điều đó có nghĩa là sử dụng '1.0'. –

+1

Câu hỏi đó không nói tiêu đề phải là HTTP/1.0. Nó chỉ được sử dụng trong ví dụ đó. do đó, không giả sử =) – mauris

Trả lời

5

Việc sử dụng phiên bản HTTP có thể dựa trên các yếu tố sau:

  • bạn web server hỗ trợ cho HTTP 1.0 hoặc 1.1
  • hỗ trợ Trình duyệt web dành cho HTTP 1.0 hoặc 1.1
  • sở thích của bạn là một nhà phát triển web trên phiên bản giao thức sử dụng

Trình duyệt hiện tại có thể hỗ trợ cả 1.0 và 1.1 tốt, và cả client và server sẽ giải quyết cho các phiên bản cao nhất cả hai có thể hỗ trợ nhau. Bạn có thể tìm thấy các khác biệt chính giữa giao thức 2: http://www8.org/w8-papers/5c-protocols/key/key.html

Tuy nhiên không có sự khác biệt chính trong việc sử dụng 404 Không tìm thấy. Tuy nhiên, hãy nhất quán cho toàn bộ trang web của bạn. tức là nếu bạn sử dụng HTTP/1.1, bạn sử dụng nó trên toàn bộ trang web của mình.

1

Nhìn vào cả RFC 1.1 và 1.0, 404 là có trong cả hai - vì vậy nó có thể là không có lý do khác hơn để máy chủ giao tiếp với máy khách mà máy chủ đang hoạt động trên http 1.1.

Điều đó nói rằng - nếu máy chủ phản hồi 404 trên Http 1.1, nó ngụ ý rằng nó có thể đã trả lại 410 - Gone thay vì chỉ ra một tài nguyên đã từng tồn tại nhưng không còn tồn tại nữa. Mã trạng thái này không phải là một phần của 1.0 và do đó thông tin này có thể hữu ích cho khách hàng (đặc biệt là trình thu thập dữ liệu web).

EDIT

Xin lỗi - Câu trả lời này có lẽ trả lời cách khác xung quanh! Tôi nghĩ bạn có thể chỉ dựa vào một số lượng máy chủ web công cộng sẽ làm phiền khi nhớ tất cả các tài nguyên đã từng tồn tại và không còn nữa (không có cách nào tôi viết mã đó vào máy chủ web của mình!) - do đó có thể tốt nhất để trả lời với 1.0 404 để chỉ ra rằng 'nó không chỉ có' thay vì 'không có ở đây, nhưng những thứ khác xung quanh trang web có thể đã từng nhưng không còn - trong trường hợp này tôi có thể gửi cho bạn một 410 '.

Có một thực tế là bạn đang cho phép các khách hàng chỉ có 1.0 làm việc với trang web của bạn.

Điều đó nói - đó là tất cả một chút gian nan.

2

Nó không quan trọng đến thế. Ứng dụng khách chịu trách nhiệm cho máy chủ biết phiên bản HTTP mà nó sử dụng. Sau đó, máy chủ được cho là sẽ trả lời với cùng một phiên bản. Điều này không phải lúc nào cũng xảy ra; Tôi vừa nhận được phản hồi này từ máy chủ:

$ telnet example.com 80 
Trying 123.123.123.123... 
Connected to example.com. 
Escape character is '^]'. 
GET /fork HTTP/1.0 

HTTP/1.1 404 Not Found 
Content-Length: 1635 
Content-Type: text/html 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Date: Tue, 04 May 2010 22:30:36 GMT 
Connection: close 

Tôi đã yêu cầu máy chủ sử dụng HTTP 1.0, nhưng nó đã đi trước và phản hồi với HTTP 1.1.

2

Tôi đã nghĩ rằng phản hồi phải là HTTP/1.0 404 Not Found nếu yêu cầu là HTTP 1.0 và HTTP/1.1 404 Not Found nếu yêu cầu là HTTP 1.1.

Trong thực tế, sẽ dễ dàng hơn cho các máy chủ trả về các câu trả lời soạn trước và phản hồi HTTP 1.0 sẽ được hiểu bởi cả khách hàng 1.0 và 1.1, vì vậy an toàn nhất để trả lại điều đó. Nếu bạn biết khách hàng hiểu được 1.1 (ví dụ vì đó là những gì nó yêu cầu), thì phản hồi 1.1 sẽ hoạt động.

Có thể cho là, hãy chơi an toàn và gửi câu trả lời 1.0.

+1

Đúng, không cần sử dụng 1,1 khi bạn không sử dụng bất kỳ tính năng 1.1 – Earlz

26

Trong PHP có lẽ bạn nên sử dụng:

header($_SERVER['SERVER_PROTOCOL']." 404 Not Found", true); 

hoặc thậm chí tốt hơn

header($_ENV['SERVER_PROTOCOL']." 404 Not Found", true); 

(nếu được hỗ trợ) và do đó để nó lên web-server mà giao thức để sử dụng.

Thực tế, nếu bạn chuyển mã trạng thái dưới dạng tham số thứ 3, bạn có thể chuyển bất kỳ thứ gì bạn muốn trong thông số thứ nhất, miễn là nó không trống và PHP sẽ làm phần còn lại. Xem http://php.net/header

header("foobar", true, 404); 

Ngoài ra: Bạn không yêu cầu có thể một phiên bản giao thức nhất định từ phía khách hàng kể từ khi giao dịch là hop-to-hop dựa, và không end-to-end. Máy chủ và trình duyệt của bạn có thể sử dụng rất tốt HTTP/1.1, nhưng nếu một inbetween proxy chỉ sử dụng HTTP/1.0, đó là những gì bạn sẽ thấy từ máy khách của mình.

+0

Có cách nào để lấy các tiêu đề * raw * được khách hàng gửi không? Bằng cách đó, tôi có nghĩa là dòng tiêu đề dòng. – Pacerier

+0

@Pacerier Tôi không biết về tiêu đề RAW, nhưng chúng là một phần của mảng $ _SERVER. – DanMan

+0

Không, ý tôi là tôi muốn lấy các tiêu đề văn bản trước khi chúng được phân tích cú pháp thành mảng. – Pacerier

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