HTTP / RFC 9110: HTTP Semantics 13.1.5. If-Range

http rfc9110 http semantics if range
20 آبان 1403

وقتی به مبحث If-Range در پروتکل HTTP می‌رسیم، مهم است که درک کنیم این یک هدر شرطی است که توسط کلاینت‌ها استفاده می‌شود تا به سرور‌ها اعلام کند تحت شرایط خاصی بخشی از یک سند را دریافت کنند. برای مثال، وقتی کاربری در حال دانلود فایل بزرگی است و اتصال او قطع می‌شود، If-Range به او اجازه می‌دهد که دانلود را از جایی که متوقف شد، ادامه دهد.

این هدر اغلب با هدر Range استفاده می‌شود. اگر شرطی که در If-Range تعیین شده است درست باشد، سرور تنها محدوده مشخص‌شده را ارسال می‌کند، وگرنه کل سند ارسال می‌شود. این شرط میتواند یک تاریخ Last-Modified باشد یا یک مقدار ETag.

بیایید نگاهی به ساختار If-Range بیندازیم. از این هدر وقتی استفاده می‌شود که کلاینت می‌خواهد بخش‌هایی از محتوا را در صورت عدم تغییر از موارد قبلی دریافت کند. به بیان دیگر، اگر محتوای روی سرور تغییر نکرده باشد، فقط بخشی از محتوا که هنوز دریافت نشده دریافت می‌شود.

ممکن است به این فکر کنید که چرا چنین چیزی مورد نیاز است؟ خب، این بهینه‌سازی پهنای باند و افزایش کارایی را برای کاربرانی که با اتصالات ناپایدار یا محدودیت‌های زمانی مواجه‌اند، به همراه دارد. تصور کنید می‌خواهید فقط تغییراتی را که در یک فایل بوجود آمده دریافت کنید، این رویکرد دقیقاً همان چیزی است که If-Range فراهم می‌آورد.

همچنین نحوه برخورد سرور با If-Range در حالتی که برخی از مقادیر همچون ETag در هدر موجود نیستند، بستگی به تنظیمات و پیاده‌سازی سرور دارد که در اسناد RFC 9110 به آن پرداخته شده است. بررسی پیاده‌سازی صحیح If-Range می‌تواند به جلوگیری از دوباره‌کاری و استفاده نابه‌جا از منابع سروری کمک کند.

GET /file.zip HTTP/1.1
Host: www.example.com
If-Range: "123456789"
Range: bytes=1000-2000

در اینجا یک درخواست HTTP برای دریافت فایل file.zip نشان داده شده است.
GET /file.zip HTTP/1.1: این خط درخواست HTTP برای دریافت منابع را نشان می‌دهد.
Host: www.example.com: مشخص می‌کند که کلاینت به کدام سرور درخواست داده است.
If-Range: "123456789": این هدر شرطی است که بیان می‌کند اگر ETag فایل تغییر نکرده باشد، درخواست Range باید انجام شود.
Range: bytes=1000-2000: این هدر درخواست می‌کند تنها بایت‌های 1000 تا 2000 فایل ارسال شود.

سوالات متداول

؟

هدر If-Range چگونه کار می‌کند؟

؟

چرا باید از If-Range استفاده کنم؟

؟

آیا If-Range همیشه با Range استفاده می‌شود؟