2012-03-12 38 views
9

Tôi đang viết API ứng dụng web, khi ai đó truy cập URL, nó sẽ trả về dữ liệu văn bản. Tôi đặt loại nội dung thành "văn bản/đồng bằng", nhưng khi tôi truy cập nó bằng Chrome, nó sẽ tải xuống một tệp có chứa thông tin, thay vì hiển thị nó. Khi tôi truy cập nó với IE, nó cho thấy đúng, và khi tôi truy cập với Firefox, nó nói rằng nó đang cố gắng truy cập một ứng dụng/octet-stream, và hỏi tôi xem tôi có muốn tải tệp xuống hay không.loại nội dung dạng văn bản đơn giản làm cho trình duyệt tải xuống tệp

tôi ghi lại những gì đã được trả về bởi các máy chủ web bằng TinyHTTPProxy, và nó như sau:

[2012-03-11 16:51:45.345] INFO  {TinyHTTPProxy Thread-4} HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked 
Connection: close 
Date: Mon, 05 Mar 2012 09:49:54 GMT 
Server: localhost 


[2012-03-11 16:51:45.345] INFO  {TinyHTTPProxy Thread-4} 10b 
P,FIO,7,31.5900,0.,,0,100,0,0,30.7600,31.9600,100,1000,,,0.,16:03:14t,,0,31.5900 ,1.2,,,15,n,,,,,03/09/2012,,31.2200,,,,-0.37,-0.37,0.274456994,,,,,0,,2846732.85 ,14,4,,3989502,BSE-CSE-NYSE-PSE-NMS,,,,,0,,,0,1155872,N,,26,26,26,16:03:14,5-7-10-11-12-13-18-25-26-28-80,0 

Nếu tôi thay đổi content-type để "ứng dụng json", sau đó nó sẽ hiển thị trên tất cả các trình duyệt. Ngoài ra, nếu tôi thay đổi kiểu nội dung thành "text/html", nó cũng hoạt động, mặc dù tôi không trả lại tệp HTML.

Có giải thích tại sao văn bản/đồng bằng hoạt động theo cách này không? Tôi đã kiểm tra để đảm bảo rằng tất cả dữ liệu được trả lại thực sự là ASCII, và vì tôi đang đặt kiểu nội dung thành văn bản/đồng bằng, tôi nhầm lẫn vì sao nó được hiểu là ứng dụng/octet-stream.

Trả lời

7

Có vẻ như bạn có thể đang chạy vào Chrome Issue 106150. Chrome dường như (đôi khi) quyết định sử dụng logic "đánh hơi" khi loại nội dung là văn bản/đồng bằng.

cách giải quyết có thể:

  • Nếu văn bản là Unicode, bao gồm BOM. Điều này sẽ cho biết logic sniffing rằng nó thực sự là văn bản.
  • Xóa byte "tìm kiếm nhị phân" khỏi tệp. Từ báo cáo lỗi "Bất kỳ giá trị nào giữa 0x00 và 0x1f trông nhị phân ngoại trừ cho ESC, CR, NP, NL, HT".
  • Có vẻ như việc sử dụng tiện ích mở rộng rõ ràng là văn bản/đồng bằng (như .txt) có thể vô hiệu hóa việc đánh hơi.
+0

Thú vị, cảm ơn thông tin, tôi đã không nhận ra rằng các trình duyệt sẽ đánh hơi dữ liệu để cố gắng làm điều gì đó thông minh hơn. – steve8918

+0

Cảm ơn vì điều này. Tôi đã kéo tóc ra cố gắng tìm ra lý do tại sao Chrome đã khăng khăng tải xuống một tập tin văn bản/đồng bằng UTF-8, và nó chỉ ra có hai trường hợp 0x02 trong đó. – dgw

+0

Chrome sẽ chỉ dò tìm các x byte đầu tiên (có thể 1KB) cho các byte nhị phân tìm kiếm, điều này có thể khiến bạn không thể đoán trước được - đôi khi tôi có byte nhị phân trong 1KB đầu tiên và đôi khi tôi không thực hiện một số cuộc gọi print_r điều tra. Xem câu trả lời của @ trinth cho giải pháp hiện tại. – thomasrutter

6

Giải thích của Laurence là chính xác. Chỉ có IE và Chrome đang thực hiện việc đánh hơi mime tại thời điểm bài đăng này. Bây giờ bạn có thể đặt tiêu đề HTTP X-Content-Type-Options: nosniff và nó sẽ thực hiện thủ thuật!

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