jenis nginx, x-accel-redirect dan mime


9

Dalam pengaturan nginx 0.8.34 saya, saya menggunakan fitur X-Accel-Redirect untuk mengontrol unduhan file dalam kode aplikasi sementara tidak ada aplikasi yang menangani unduhan itu sendiri.

Setelah banyak rasa sakit ini sekarang pada dasarnya berfungsi kecuali nginx selalu mengembalikan file dengan text/htmltipe konten.

Jenis konten default adalah application / octet-stream, ditentukan dalam httpblokir.

Blok server berisi, antara lain, definisi direktori tempat file disimpan:

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

Jadi saya menentukan jenis konten bahkan di sini tetapi tidak ada yang berubah.

Saya tidak ingin mengatur Content-Type oleh aplikasi karena saya akan memperlambat saya (pertama-tama saya harus menentukannya). Jadi idealnya nginx akan mengembalikan mimetype yang benar berdasarkan ekstensi file (saya menyertakan mime.types di httpblok).

Jawaban:


12

Jika Anda ingin membiarkan nginx menebak jenis mime yang tepat, Anda harus memastikan tidak ada tipe konten yang dikembalikan dari server backend Anda.

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

1
dengan tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') ketika metode .clear mengatur tipe-tipe konten menjadi teks / html
Anthony

1

Saya pribadi hanya mengatur aplikasi / octet-stream dalam aplikasi tetapi Anda mungkin dapat menggunakan fastcgi_ignore_headers untuk mencegah Nginx dari menggunakan header yang disediakan back-end.

fastcgi_ignore_headers Content-Type;

Terima kasih atas jawaban Anda. Saya ingin server berbagai jenis konten sehingga gambar dirender sebagai gambar dan file zip ditawarkan sebagai opsi unduhan. Jadi sayangnya ini tidak cukup menyelesaikannya.
Tomas Kohl

Apakah Anda mencobanya atau Anda hanya menganggap itu tidak akan berhasil? Dengan mengabaikan header yang disediakan back-end itu harus mencoba untuk menentukan berdasarkan file.
Martin Fjordvald

2
Orang tidak bisa mengabaikan Content-Type. Menurut wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers nilai-nilai yang mungkin adalah X-Accel-Redirect, X-Accel-Expires, ExpiresatauCache-Control
jnns

1
"Adalah mungkin untuk menentukan header seperti" sementara frasa menyebalkan tidak berarti "nilai yang mungkin adalah". Saya telah mengabaikan Content-Type sebelumnya dalam kombinasi dengan x-accel-redirect jadi saya tidak berpikir itu tidak mungkin, meskipun, saya akui bahwa saya tidak akrab dengan detail berpasir.
Martin Fjordvald

@ MartinFjordvald, mencobanya dan nginx menolak untuk mulai mengeluh nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27tetapi fastcgi_ignore_headers "Expires"bekerja
dnozay

0

dengan php-fpm:

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

memberitahu php untuk tidak mengirim header Tipe Konten sama sekali (bahkan bukan header kosong), dan nginx akan menebak jenisnya untuk Anda dan menambahkan header :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.