এনগিনেক্স ছড়িয়ে পড়া সামগ্রীর জন্য সামগ্রী-দৈর্ঘ্যের শিরোনাম সরিয়ে দেয়


10

আমি কোনও স্ক্রিপ্টের প্রক্সি করতে nginx 1.2.3 ব্যবহার করি:

proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8880;
proxy_buffering off;
proxy_read_timeout 300s;
gzip off;

স্ক্রিপ্টগুলি উভয়ই প্রেরণ করে Transfer-encoding: chunkedএবং Content-Length: 251:

HTTP/1.0 307 Temporary Redirect
Content-length: 251
Pragma: no-cache
Location: /...
Cache-control: no-cache
Transfer-encoding: chunked

আমার উভয়ের প্রয়োজন, তবে এনজিনেক্স স্বয়ংক্রিয়ভাবে এগুলি সরিয়ে দেয় 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: /...

ফলস্বরূপ, ক্লায়েন্টরা খণ্ডগুলি প্রেরণের জন্য অপেক্ষা করে না। এটি nginx এর পূর্ববর্তী সংস্করণে কাজ করত।


এনগিনেক্স প্রক্সি থেকে শিরোনামগুলি দেখতে কেমন?
অবধি

এটি কোন সংস্করণে কাজ করত?
সিএনএসটি

এটি nginx 0.9.8
জুলিয়েন

আপনি এইচটিটিপি প্রোটোকল লঙ্ঘন করছেন। এটি এনজিনেক্স ০.৯.৮ নিয়ে কাজ করে, কারণ ১.১.৪ সংস্করণ অবধি এটি ছিন্নমূল এনকোডিং মোটেই সমর্থন করে না।
ভিবার্ট

উত্তর:


11

দুর্ভাগ্যক্রমে, আমি সিএনএসটির পোস্টে মন্তব্য করতে পারি না - তাই আমি এখানে উত্তর দিতে যাচ্ছি।

nginx_http_proxyHTTP- র / 1.0 মধ্যে মূল প্রজেক্টের সঙ্গে ডিফল্ট কথাবার্তায় মডিউল। নির্দেশের মাধ্যমে এটি পরিবর্তন করা যেতে পারে proxy_http_version 1.1

এটি আপনার স্ক্রিপ্টের জন্য এইচটিটিপি / ১.০ উত্তর ফেরত দেওয়ার কারণও হতে পারে, যদিও 307এই সংস্করণে খণ্ডিত কোডিং এবং স্থিতি কোডের অস্তিত্ব নেই।

আপনাকে পুনর্নির্দেশের সাথে খণ্ডিত কোডিং ব্যবহার করা উচিত নয় , কারণ এটি সত্যিকার অর্থে বোঝা যায় না।

অতিরিক্তভাবে , দেখে মনে হচ্ছে এনজিনেক্স প্রবাহ থেকে একের পর এক ক্লায়েন্টে স্থান দেয় না , তবে এটি প্রবাহের প্রতিক্রিয়াটিকে বাফার করেContent-Lengthহেডার ক্ষেত্র উপেক্ষিত হয়েছে কারণ এটি সংজ্ঞা বিরুদ্ধে হয়। আমাকে মডিউলটির উত্স কোডটি দেখতে হয়েছিল কারণ এগুলি সমস্তই অনিবন্ধিত বলে মনে হচ্ছে।

আপনি nginx_tcp_proxy_moduleকাঁচা টিসিপি ডেটা হিসাবে খণ্ডিত সামগ্রীটি প্রক্সি করার চেষ্টা করতে পারেন: গিথুবে মডিউল


আপডেট (10.04.14) মডিউলের জন্য সমর্থন আছে হেডার , যার মধ্যে এক ( ) নিয়ন্ত্রণ প্রতিক্রিয়া বা বাফার করা হবে কিনা তা নয়।
nginx_http_proxyX-Accel-* X-Accel-Buffering: yes|no

X-Accel-Buffering: noব্যাকএন্ডের প্রতিক্রিয়ায় এই শিরোনামটি ( ) যুক্ত করার ফলে এনজিনেক্স সরাসরি ক্লায়েন্টের কাছে খণ্ডগুলি পৌঁছে দেবে।

এই শিরোনামটি প্রতি অনুরোধের ভিত্তিতে বাফারিং নিয়ন্ত্রণ করতে দেয় ।

মডিউলটিতে প্রতিক্রিয়া বাফারিং সক্ষম বা অক্ষম করার জন্য একটি কনফিগারেশন নির্দেশিকাও রয়েছে proxy_buffering (বাফারিং না করার অর্থ খণ্ডগুলি প্রেরণা কাজ করবে)।

প্রক্সি বাফারিং (উভয় শিরোনাম এবং নির্দেশ ভিত্তিক) এখানে নথিভুক্ত করা হয়েছে


এমনকি তার সাথে এটি করা উচিত নয় nginx_tcp_proxy_module। এটি কিছু ব্রাউজারগুলির সাথে কাজ করে কারণ তারা খুব ত্রুটি সহনকারী।
ভিবার্ট

কারণ এগুলি সমস্তই অনিবন্ধিত ভুল বলে মনে হচ্ছে । এটি আরএফসি 2616 তে নথিভুক্ত হয়েছে See দেখুন 13.5.1
ভিবার্ট

@VBart ব্যাপারে নিশ্চিত হওয়ার মান হয় - কিন্তু প্রায় শুধুমাত্র খুব কম তথ্য আছে কতদূর বিশেষ করে nginx কার্যকরী them.The বিভিন্ন TCP প্রক্সি মডিউল একটি প্রস্তাবিত hust হয় কার্যসংক্রান্ত
Lukas

9

Lukas হিসাবে alludet হিসাবে, HTTP 1.1 সেট Content-Lengthআছে নিষিদ্ধ Transfer-Encoding

Http://www.ietf.org/rfc/rfc2616.txt উদ্ধৃতি :

   3.If a Content-Length header field (section 14.13) is present, its
     decimal value in OCTETs represents both the entity-length and the
     transfer-length. The Content-Length header field MUST NOT be sent
     if these two lengths are different (i.e., if a Transfer-Encoding
     header field is present). If a message is received with both a
     Transfer-Encoding header field and a Content-Length header field,
     the latter MUST be ignored.

অধিকন্তু, এইচটিটিপি 1.1 এর সাথে সম্মতিতে এনগিনেক্সের সঠিক আচরণ এইচটিটিপি অনুরোধ চোরাচালানের আক্রমণ প্রতিরোধের দিকে অনেক এগিয়ে যায় goes
amn

3

বিশেষ করে পুনর্নির্দেশিত প্রতিক্রিয়া সহ আপনার স্ক্রিপ্টটির প্রথমে কেন ছাঁটাই করা এনকোডিং দরকার তা আপনি নির্দিষ্ট করে ব্যাখ্যা করেননি।

আমি এখানে প্রচুর সমস্যা দেখছি।

  • Transfer-Encoding: chunkedএকটি HTTP/1.1বৈশিষ্ট্য (এবং আপনার স্ক্রিপ্টটি HTTP/1.0শিরোনামের সাথে উত্তর দিচ্ছে বলে মনে হচ্ছে )

  • সেখানে নেই 307HTTP/1.0

  • এর পুরো উদ্দেশ্যটি chunkedহ'ল আপনি কী ছিলেন তা জানেন না Content-Length, সুতরাং chunkedএর মধ্যে দৈর্ঘ্য সরবরাহ করার জায়গায় ব্যবহৃত হয় Content-Length, পরিবর্তে প্রকৃত সামগ্রীর সাথে মিলিত প্রতিক্রিয়াটির শরীরে দৈর্ঘ্য সরবরাহ করা হয়; কোনও স্ক্রিপ্ট উভয় শিরোলেখকে সামনে জেনারেট করা অর্থহীন হবে

আমি ব্যক্তিগতভাবে পরিচিত নই chunked, তবে http://en.wikedia.org/wiki/Chunked_transfer_encoding এবং এছাড়াও http://tools.ietf.org/html/rfc2616#section-3.6.1 এ প্রাথমিক তথ্য অনুসারে , আমি অনুমান করতে পারি যে আপনার স্ক্রিপ্টের খণ্ডিত এনকোডিংয়ের পুরো পরিচালনা পুরোপুরি ভুল হতে পারে।

যদি উপরের অংশটি এখনও এটি আবৃত করে না, এবং সমস্ত বাস্তবতায় অন্যথায়, এটি একটি অস্পষ্টও নয় কেন একটি উত্তর 307বা 302এইচটিপিএস স্থিতি কোডের সাথে একটি "অদ্ভুত" এনকোডিং সরবরাহ করা উচিত। এনজিঙ্ক্স মেলিং তালিকায় সম্প্রতি একই রকম আলোচনা হয়েছিল 410 Goneএবং অন্যান্য ত্রুটি পৃষ্ঠাগুলি সর্বদা gzipসংক্ষেপণ থেকে বাদ ছিল এবং আমি মনে করি যে অনুভূতিটি এখানে সমানভাবে প্রযোজ্য হবে। ( http://mailman.nginx.org/pipermail/nginx/2013- মার্চ / 037890.html )


আমি এটি ব্যবহারকারীকে অপেক্ষা করার জন্য ব্যবহার করি: আমি প্রতি সেকেন্ডে খণ্ডগুলি প্রেরণ করি, যাতে ব্যবহারকারী কোনও সময়সীমা না পেয়ে এক্স সেকেন্ডের জন্য পুনঃনির্দেশের জন্য অপেক্ষা করতে পারে
জুলিয়েন

আমি প্রথম ফিক্স HTTP- র / 1.0 HTTP- র / 1.1 করতে আপনাকে উপদেশ চাই (এই জিনিস কি একটি পার্থক্য করতে), এবং নিশ্চিত করুন যে আপনার chunked এনকোডিং অপ্রকৃত করা হয় না। এনগিনেক্সের নতুন সংস্করণ সম্ভবত এমন কয়েকটি শিরোনামকে বাতিল করে দেয় যার উপর আপনি নির্ভর করে কারণ সেগুলি ভুল।
সিএনএসটি

1

আমি একই সমস্যাটি এইচটিএমএল 5 ভিডিও ট্যাগের মাধ্যমে এমপি 4 ফাইল স্ট্রিমিং করেছিলাম।

সাফারি এবং ফায়ারফক্স স্বাভাবিকভাবে আচরণ করেছিল যেখানে ক্রোম কিছু সময়ে ERR_CONTENT_LENGTH_MISMATCH ট্রিগার করছিল (তবে এটি ব্যর্থ হওয়ার আগে বেশ কয়েক মিনিটের ভিডিও আমাকে ওয়াচ করার অনুমতি দেয়)।

এমপি 4 ফাইলে ক্যাশে নিয়ন্ত্রণ বন্ধ করার পরে সমস্যাটি পুনরুত্পাদন করতে পারেনি।


0

এই উত্তরটি ভাগ করে নেওয়ার ক্ষেত্রে এসওকে পোস্ট করা যদি এটি সহায়ক হয়: /programming/50499637/mp4-video-safari-cloudflare-nginx-rails-no-play/59348509#59348509

এমপি 4 প্লেব্যাকের সাথে আমার একই রকম সমস্যা ছিল কারণগুলি অংশগুলি পরিবেশন করা হয়নি এবং অ্যাপল এর গাইড প্রতি বিষয়টি নীচে তালিকাভুক্ত করেছেন। আমি যাচাই করেছি যে আমি পুরো ফাইলটি ডাউনলোড করছি এবং নীচে ঠিক করার পরে, কেবল প্রথম অংশটি।

curl --range 0-99 http://example.com/test.mov -o /dev/null

আমি আমার nginx.conf আমার gzip, কম্প্রেশন সেটিংস পরিবর্তন, এর gzip, কম্প্রেশন মুছে ফেলার জন্য আমার সাফারি .mp4 প্লেব্যাক সমাধান .mp4 ফাইল।

রেফারেন্সের জন্য এখানে এনগিনেক্সে ব্লক। (দ্রষ্টব্য: আপনার অ্যাপ্লিকেশনটি কীভাবে কনফিগার করা হয়েছে তার উপর নির্ভর করে আপনাকে অবস্থানের লাইনটি পরিবর্তনের প্রয়োজন হতে পারেlocation ~ \.mp4$ {

location ~ ^/(assets|system|videos)/  {
   expires max;
   add_header Cache-Control public;
   add_header ETag "";
   gzip on;
   gzip_http_version 1.1;
   gzip_vary on;
   gzip_comp_level 6;
   gzip_proxied any;

   # Reference configuration
   #gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript video/mp4 application/mp4 image/jpeg image/png image/svg+xml application/x-font-ttf application/x-font-truetype application/font-woff application/font-woff2 application/vnd.ms-fontobject;

   # Kelton trying to fix cloudflare by removing the mp4 settings
   gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript image/jpeg image/png image/svg+xml application/application/x-font-ttf application/x-font-truetype application/font-woff application/font-woff2 application/vnd.ms-fontobject;
}

অ্যাপলের ডকুমেন্টেশন রেফারেন্সের লিঙ্ক: https://developer.apple.com/library/archive/docamentation/ অ্যাপ্লিকেশন অ্যাপ্লিকেশনস / রেফারেন্স / সাফারি ওয়েবে কনটেন্ট / ক্রিয়েটিংভিডিওফোরসফেরনিফোন / ক্রিয়েটিংভিডিওফোরসফারনি আইফোন HTML_//apple_ref/ doc/ uid/ TP4000

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.