các loại nginx, x-accel-redirect và mime


9

Trong cài đặt nginx 0.8.34 của tôi, tôi đang sử dụng tính năng X-Accel-Redirect để kiểm soát tải xuống tệp trong mã ứng dụng trong khi ứng dụng không tự xử lý việc tải xuống.

Sau nhiều đau đớn, điều này bây giờ về cơ bản hoạt động ngoại trừ nginx luôn trả về tệp có text/htmlloại nội dung.

Loại nội dung mặc định là application / octet-stream, được chỉ định trong httpkhối.

Khối máy chủ chứa, trong số những thứ khác, định nghĩa của thư mục nơi các tệp được lưu trữ:

location /files {
  default_type  application/octet-stream;
  alias /srv/www/uploads;
  internal;  
}

Vì vậy, tôi đã chỉ định loại nội dung ngay cả ở đây nhưng không có gì thay đổi.

Tôi không muốn đặt Loại nội dung theo ứng dụng vì sau đó tôi sẽ làm chậm tôi (trước tiên tôi phải xác định nó). Vì vậy, lý tưởng nginx sẽ trả về mimetype chính xác dựa trên phần mở rộng tệp (tôi bao gồm mime.types trong httpkhối).

Câu trả lời:


12

Nếu bạn muốn để nginx đoán đúng loại mime, bạn chỉ cần đảm bảo không có loại nội dung nào được trả về từ máy chủ phụ trợ của bạn.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response

1
với tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') làm phương thức .clear đặt loại nội dung thành văn bản / html
Anthony

1

Cá nhân tôi chỉ đặt ứng dụng / octet-stream trong ứng dụng nhưng bạn thể sử dụng fastcgi_ignore_headers để ngăn Nginx sử dụng tiêu đề được cung cấp phía sau.

fastcgi_ignore_headers Content-Type;

Cảm ơn bạn vì câu trả lời. Tôi muốn máy chủ các loại nội dung khác nhau để hình ảnh hiển thị dưới dạng hình ảnh và tệp zip được cung cấp dưới dạng tùy chọn tải xuống. Thật không may, điều này không hoàn toàn giải quyết nó.
Tomas Kohl

Bạn đã thử nó hay bạn chỉ cho rằng nó sẽ không hoạt động? Bằng cách bỏ qua tiêu đề được cung cấp phía sau, nó sẽ cố gắng xác định nó dựa trên tệp.
Martin Fjordvald

2
Người ta không thể bỏ qua Content-Type. Theo wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers giá trị có thể là X-Accel-Redirect, X-Accel-Expires, ExpireshoặcCache-Control
jnns

1
"Có thể chỉ định các tiêu đề như" trong khi cụm từ shitty không có nghĩa là "các giá trị có thể là". Tôi đã bỏ qua Kiểu nội dung trước khi kết hợp với x-accel-redirect vì vậy tôi không nghĩ rằng điều đó là không thể, tuy nhiên, tôi sẽ thừa nhận tôi không thân mật với các chi tiết nghiệt ngã.
Martin Fjordvald

@MartinFjordvald, đã thử nó và nginx từ chối bắt đầu phàn nàn nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27nhưng fastcgi_ignore_headers "Expires"hoạt động
dnozay

0

với php-fpm:

<?php
    header("Content-Type: ");
    header("X-accel-redirect: (...)");

yêu cầu php hoàn toàn không gửi tiêu đề Kiểu nội dung (thậm chí không phải là tiêu đề trống) và nginx sẽ đoán loại cho bạn và thêm tiêu đề :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.