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

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

هيروكي كومازاكي
هيروكي كومازاكي

بصفتك موزّع 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 في developer.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 في domains.test/index.html.sxg بdistribution.test/app.js في عدم تطابق التوقيع.

لحل هذه المشكلة، تتوفّر حاليًا في Chrome ميزة تجريبية للجلب المُسبَق للموارد الفرعية بشأن SXG. يمكنك تفعيلها على: 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. يمكنك أيضًا الانضمام إلى مناقشة المواصفات، أو الإبلاغ عن خطأ إلى الفريق. ستساعد ملاحظاتك بشكل كبير في عملية توحيد المقاييس كما ستساعد في معالجة مشاكل التنفيذ. شكرًا.