كيفية توزيع Signed HTTP Exchanges (SXG) باستخدام nginx

كيفية الحصول على ملفات SXG وعرضها باستخدام nginx، وتحديات الجلب المسبق للموارد الفرعية.

Hiroki Kumazaki
Hiroki Kumazaki

بصفتك موزّعًا لـ Signed HTTP Exchange (SXG)، يمكنك إرسال ملفات SXG نيابةً عن صنّاع المحتوى الأصليين. ستعرض متصفّحات الويب المتوافقة مع SXG ملفات SXG هذه كما لو تم إرسالها من صنّاع المحتوى الأصليين. ويتيح لك ذلك تنفيذ التحميل المُسبق على مواقع إلكترونية متعددة بدون انتهاك الخصوصية. يوضِّح لك هذا الدليل كيفية توزيع SXG بشكل صحيح.

التوافق مع جميع المتصفحات

Chrome هو حاليًا المتصفّح الوحيد الذي يتوافق مع SXG. شاهد الإجماع قسم توحيد عمليات تبادل HTTP الموقَّعة من المصدر للاطّلاع على مزيد من المعلومات الحديثة.

الحصول على ملفات SXG

حدِّد في عنوان طلب Accept أنّك تريد من الخادم عرض ملف SXG مع الطلب:

Accept: application/signed-exchange;v=b3,*/*;q=0.8

يفترض هذا الدليل أنّك وضعت ملفات SXG في /var/www/sxg.

عرض ملف SXG بسيط

أرفق العناوين التالية لتوزيع ملف SXG واحد:

Content-Type: application/signed-exchange;v=v3
X-Content-Type-Options: nosniff

ضبط nginx:

http {
    ...
    types {
        application/signed-exchange;v=b3  sxg;
    }
    add_header X-Content-Type-Options nosniff;

    location / {
        more_set_headers "Content-Type: application/signed-exchange;v=b3";
        alias /var/www/sxg/;
        try_files $uri.sxg $uri =404;
        autoindex off;
    }
    ...

حمِّل الإعدادات الجديدة في nginx:

sudo systemctl restart nginx.service

سيبدأ nginx في عرض ملفات SXG. عندما يصل Chrome إلى خادمك، سيظهر عنوان ناشر المحتوى الأصلي في الشريط!

الجلب المسبق للمراجع الفرعية

تتكون معظم صفحات الويب من عدة موارد فرعية، مثل CSS وJavaScript والخطوط والصور. لا يمكن تغيير محتوى SXG بدون المفتاح الخاص لصانع المحتوى. يؤدي ذلك إلى حدوث مشاكل عندما يحاول المتصفّح حلّ الموارد الفرعية.

على سبيل المثال، لنفترض أن index.html.sxg من https://website.test/index.html لديه رابط إلى https://website.test/app.js. عندما يتلقّى متصفّح المستخدم ملف SXG من "https://distributor.test/example.com/index.html.sxg"، سيعثر على الرابط إلى https://website.test/app.js. يمكن للمتصفّح جلب https://website.test/app.js عند الوصول الفعلي مباشرةً، ولكن يجب ألا يتم في مرحلة التحميل المُسبق للحفاظ على الخصوصية. إذا تم جلب المورد خلال مرحلة التحميل المُسبق، سيكون بإمكان صانع المحتوى (website.test) رصد موزِّع المحتوى (distributor.test) الذي يطلب المورد.

الرابط إلى app.js في distribution.test/index.html.sxg يشير إلى website.test/app.js.

إذا أراد الموزّع تقديم خدمة app.js.sxg من خدمته الخاصة وحاول تعديل https://website.test/app.js ليكون إصدار الموزّع من هذا المورد الفرعي (مثل https://distributor.test/website.test/app.js.sxg)، سيؤدي ذلك إلى عدم تطابق التوقيع ويجعل SXG غير صالح.

تؤدّي محاولة ربط المرجع بـ app.js في distribution.test/index.html.sxg إلى distribution.test/app.js إلى عدم تطابق في التوقيع.

لحل هذه المشكلة، تتوفّر الآن ميزة تجريبية للجلب المسبق لمورد فرعي من SXG في Chrome. يمكنك تفعيلها على: about://flags/#enable-sxg-subresource-prefetching. لاستخدام الجلب المسبق للمورد الفرعي، يجب استيفاء الشروط التالية:

  • على الناشر تضمين إدخال عنوان الاستجابة في SXG، مثل: link: <https://website.test/app.js>;rel="preload";as="script",<https://website.test/app.js>;rel="allowed-alt-sxg";header-integrity="sha256-h6GuCtTXe2nITIHHpJM+xCxcKrYDpOFcIXjihE4asxk=". تحدّد هذه السمة المورد الفرعي الذي يمكن استبداله بتجزئة السلامة الخاصة الخاصة بـ SXG.
  • على الموزّع إرفاق عنوان استجابة عند عرض SXG، مثل: link: <https://distributor.test/website.test/app.js.sxg>;rel="alternate";type="application/signed-exchange;v=b3";anchor="https://website.test/app.js". يحدّد هذا الحقل مسار app.js ويتوافق مع المورد الفرعي.

علامة ارتساء

الطريقة الأولى سهلة نسبيًا لأنّ أداة nginx-sxg-module يمكنها حساب تجزئات السلامة وتضمينها في عناوين الروابط من الردود الأولية. أما الخيار الثاني، فهو أكثر صعوبة لأنّه يجب أن يكون موزِّع المحتوى على دراية بالموارد الفرعية المحدّدة في SXG.

في حال عدم توفّر موارد فرعية سوى https://website.test/app.js، سيكون كل ما عليك إلحاقه في إعداد nginx هو:

add_header link <https://distributor.test/website.test/app.js.sxg>;rel="alter...

ولكن هذه الحالات نادرة لأن مواقع الويب النموذجية تتكون من الكثير من الموارد الفرعية. بالإضافة إلى ذلك، على الموزّع إرفاق عنوان رابط الإرساء المناسب عند عرض ملف SXG. في الوقت الحالي، لا تتوفر طريقة سهلة لحل هذه المشكلة، لذا ننصحك بمتابعة أخبارنا باستمرار.

إرسال ملاحظات

يحرص مهندسو Chromium على معرفة ملاحظاتك حول توزيع SXG من خلال الرابط webpackage-dev@chromium.org. يمكنك أيضًا الانضمام إلى مناقشة المواصفات أو إبلاغ الفريق عن خطأ. ستساعد ملاحظاتك جدًا في عملية توحيد المقاييس ومعالجة مشاكل التنفيذ. شكرًا