Saya menggunakan nginx 1.2.3 untuk proksi ke skrip:
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8880;
proxy_buffering off;
proxy_read_timeout 300s;
gzip off;
Script mengirim keduanya Transfer-encoding: chunked
dan Content-Length: 251
:
HTTP/1.0 307 Temporary Redirect
Content-length: 251
Pragma: no-cache
Location: /...
Cache-control: no-cache
Transfer-encoding: chunked
Saya membutuhkan keduanya, tetapi nginx secara otomatis menghapus Content-Length
:
HTTP/1.1 302 Found
Server: nginx/1.2.3
Content-Type: application/json; charset=utf-8
Content-Length: 58
Connection: keep-alive
Location: /...
Akibatnya, klien tidak menunggu bongkahan dikirim. Ini digunakan untuk bekerja dengan versi nginx sebelumnya.
Jawaban:
Sayangnya, saya tidak dapat mengomentari kiriman cnst - jadi saya akan menjawab di sini.
The
nginx_http_proxy
modul dengan pembicaraan default dengan hulu di HTTP / 1.0. Ini bisa diubah dengan arahanproxy_http_version 1.1
.Ini mungkin juga menjadi penyebab skrip Anda mengembalikan jawaban HTTP / 1.0, meskipun kode chunked dan kode status
307
tidak ada dalam versi ini.Anda juga tidak boleh menggunakan chunked coding dengan redirect , karena ini tidak masuk akal.
Selain itu, sepertinya nginx tidak meneruskan bongkahan dari hulu ke klien satu per satu, tetapi ia mendukung respons hulu . Bidang
Content-Length
tajuk diabaikan karena melanggar definisi. Saya harus melihat kode sumber modul karena semua ini tampaknya tidak berdokumen.Anda mungkin ingin mencoba
nginx_tcp_proxy_module
proksi konten chunked sebagai data TCP mentah: Modul di GithubUPDATE (10.04.14)
The
nginx_http_proxy
modul memiliki dukungan untukX-Accel-*
header , yang satu (X-Accel-Buffering: yes|no
) mengontrol apakah respon harus buffered atau tidak.Menambahkan header ini (
X-Accel-Buffering: no
) ke respons backend akan menyebabkan nginx untuk secara langsung meneruskan potongan ke klien.Header ini memungkinkan untuk mengontrol penyanggaan berdasarkan permintaan .
Modul ini juga memiliki arahan konfigurasi
proxy_buffering
untuk mengaktifkan atau menonaktifkan buffering respons (bukan buffering berarti mengirim potongan akan berfungsi).Proxy buffering (berbasis header dan direktif) didokumentasikan di sini .
sumber
nginx_tcp_proxy_module
. Ini bekerja dengan beberapa browser hanya karena mereka sangat toleran terhadap kesalahan.Sebagai Lukas alludet to, HTTP 1.1 melarang
Content-Length
jika adaTransfer-Encoding
set.Mengutip http://www.ietf.org/rfc/rfc2616.txt :
sumber
Anda belum menjelaskan secara terperinci mengapa skrip Anda perlu penyandian chunked, terutama dengan respons pengalihan.
Saya melihat banyak masalah di sini.
Transfer-Encoding: chunked
adalahHTTP/1.1
fitur (dan skrip Anda tampaknya membalas denganHTTP/1.0
tajuk)tidak ada
307
diHTTP/1.0
tujuan keseluruhannya
chunked
adalah bahwa Anda tidak tahuContent-Length
akan menjadi apa Anda , jadi,chunked
digunakan untuk menyediakan panjang di dalamContent-Length
, di mana alih-alih panjang disediakan di dalam tubuh respons, dicampur dengan konten yang sebenarnya; tidak ada gunanya bagi skrip untuk membuat kedua header di mukaSaya pribadi tidak terbiasa dengan
chunked
, tetapi sesuai info dasar di http://en.wikipedia.org/wiki/Chunked_transfer_encoding dan juga http://tools.ietf.org/html/rfc2616#section-3.6.1 , Saya akan memperkirakan bahwa seluruh penanganan skrip chunked skrip Anda mungkin sepenuhnya salah.Jika hal di atas masih belum mencakupnya, dan dalam kenyataannya semua, sebaliknya, juga tidak jelas mengapa balasan dengan kode status http
307
atau302
harus diberikan dengan pengkodean "aneh". Baru-baru ini ada diskusi serupa di milis nginx tentang410 Gone
dan halaman kesalahan lainnya selalu dikecualikan darigzip
kompresi, dan saya pikir sentimen akan sama berlaku di sini. ( http://mailman.nginx.org/pipermail/nginx/2013-March/037890.html )sumber
Saya memiliki masalah yang sama saat streaming file mp4 melalui tag video html5.
Safari dan Firefox berperilaku normal sedangkan Chrome memicu ERR_CONTENT_LENGTH_MISMATCH di beberapa titik (tapi itu memungkinkan saya untuk memutar beberapa menit video sebelum gagal).
Masalahnya tidak muncul kembali setelah saya mematikan kontrol cache untuk file mp4.
sumber
Membagikan jawaban ini yang saya posting ke SO jika bermanfaat: /programming/50499637/mp4-video-safari-cloudflare-nginx-rails-no-play/59348509#59348509
Saya memiliki masalah yang sama dengan pemutaran mp4 karena potongan tidak dilayani, dan mengonfirmasi masalah per panduan Apple, tercantum di bawah ini. Saya memverifikasi saya mengunduh seluruh file, dan setelah perbaikan di bawah ini, hanya potongan pertama.
Saya menyelesaikan pemutaran Safari .mp4 dengan mengubah pengaturan kompresi gzip di nginx.conf, untuk menghapus kompresi gzip pada file .mp4 .
Inilah blok di nginx untuk referensi. (Catatan: tergantung pada bagaimana aplikasi Anda dikonfigurasi, Anda mungkin perlu mengubah garis lokasi ke
location ~ \.mp4$ {
Tautan ke referensi dokumentasi Apple: https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP400014
sumber