nginx का इस्तेमाल करके, साइन किए हुए एचटीटीपी एक्सचेंज (एसएक्सजी) को उपलब्ध कराने का तरीका

nginx का इस्तेमाल करके, एसएक्सजी फ़ाइलें पाने और उन्हें दिखाने का तरीका. साथ ही, सब-रिसॉर्स को प्रीफ़ेच करने से जुड़ी समस्याएं.

Hiroki Kumazaki
Hiroki Kumazaki

साइन किए गए एचटीटीपी एक्सचेंज (एसएक्सजी) के डिस्ट्रिब्यूटर के तौर पर, आपके पास ओरिजनल कॉन्टेंट क्रिएटर्स की ओर से एसएक्सजी फ़ाइलें डिलीवर करने का विकल्प होता है. एसएक्सजी के साथ काम करने वाले वेब ब्राउज़र, ऐसी एसएक्सजी फ़ाइलों को ऐसे दिखाएंगे जैसे वे ओरिजनल कॉन्टेंट क्रिएटर्स से डिलीवर की गई हों. इससे, निजता का उल्लंघन किए बिना, क्रॉस-साइट पहले से लोड करने की प्रोसेस लागू की जा सकती है. इस गाइड में, SXG को सही तरीके से डिस्ट्रिब्यूट करने का तरीका बताया गया है.

क्रॉस-ब्राउज़र सहायता

फ़िलहाल, सिर्फ़ Chrome ऐसा ब्राउज़र है जिस पर एसएक्सजी काम करता है. अप-टू-डेट जानकारी के लिए, ऑरिजिन से हस्ताक्षर किए गए एचटीटीपी एक्सचेंज का सहमति और मानक सेक्शन देखें.

एसएक्सजी फ़ाइलें पाएं

अपने Accept अनुरोध के हेडर में यह जानकारी दें कि सर्वर, अनुरोध के साथ एसएक्सजी फ़ाइल करे:

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

इस गाइड में यह माना गया है कि आपने अपनी SXG फ़ाइलों को /var/www/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, एसएक्सजी फ़ाइलें दिखाना शुरू कर देगा. जब Chrome आपके सर्वर को ऐक्सेस करेगा, तो बार में ओरिजनल कॉन्टेंट पब्लिशर का पता दिखेगा!

सब-रिसॉर्स को प्रीफ़ेच करना

ज़्यादातर वेब पेजों में कई सब-रिसॉर्स होते हैं, जैसे कि सीएसएस, JavaScript, फ़ॉन्ट, और इमेज. कॉन्टेंट क्रिएटर की निजी कुंजी के बिना, एसएक्सजी का कॉन्टेंट बदला नहीं जा सकता. इससे, ब्राउज़र को सब-रिसॉर्स को रिज़ॉल्व करने में समस्याएं आती हैं.

उदाहरण के लिए, मान लें कि https://website.test/index.html से index.html.sxg में https://website.test/app.js का लिंक है. जब किसी उपयोगकर्ता के ब्राउज़र को https://distributor.test/example.com/index.html.sxg से एसएक्सजी फ़ाइल मिलती है, तो उसे https://website.test/app.js का लिंक मिल जाएगा. ब्राउज़र, https://website.test/app.js को सीधे तौर पर ऐक्सेस करने पर फ़ेच कर सकता है. हालांकि, निजता बनाए रखने के लिए, इसे पहले से लोड करने के दौरान नहीं किया जाना चाहिए. अगर संसाधन को प्रीलोड करने के दौरान फ़ेच किया गया था, तो कॉन्टेंट क्रिएटर (website.test) यह पता लगा सकता है कि संसाधन का अनुरोध कौनसा कॉन्टेंट डिस्ट्रिब्यूटर (distributor.test) कर रहा है.

sellers.test/index.html.sxg में app.js का लिंक वेबसाइट.test/app.js पर ले जाता है.

अगर डिस्ट्रिब्यूटर अपनी सेवा से app.js.sxg को सेवा देना चाहता है और https://website.test/app.js को उस सबरिसॉर्स (जैसे, https://distributor.test/website.test/app.js.sxg) के डिस्ट्रिब्यूटर वर्शन के तौर पर सेट करने की कोशिश करता है, तो हस्ताक्षर मेल नहीं खाएंगे. साथ ही, एसएक्सजी अमान्य हो जाएगा.

distributor.test/index.html.sxg में मौजूद app.js के रेफ़रंस को distributor.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 के खास इंटिग्रिटी हैश से बदला जा सकता है.
  • एसएक्सजी दिखाते समय, डिस्ट्रिब्यूटर को रिस्पॉन्स हेडर अटैच करना होगा, जैसे कि 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, इंटिग्रिटी हैश का हिसाब लगा सकता है और उन्हें अपस्ट्रीम रिस्पॉन्स के लिंक हेडर में जोड़ सकता है. हालांकि, दूसरा तरीका ज़्यादा मुश्किल है, क्योंकि कॉन्टेंट डिस्ट्रिब्यूटर को एसएक्सजी में बताए गए सबरिसॉर्स की जानकारी होनी चाहिए.

अगर https://website.test/app.js के अलावा कोई अन्य सब-रिसॉर्स नहीं है, तो आपको अपने nginx कॉन्फ़िगरेशन में सिर्फ़ यह जोड़ना होगा:

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

हालांकि, ऐसे मामले बहुत कम होते हैं, क्योंकि आम तौर पर वेबसाइटों में कई सब-रिसॉर्स होते हैं. इसके अलावा, एसएक्सजी फ़ाइल दिखाते समय, डिस्ट्रिब्यूटर को सही ऐंकर लिंक हेडर अटैच करना होगा. फ़िलहाल, इस समस्या को हल करने का कोई आसान तरीका नहीं है. इसलिए, अपडेट पाने के लिए हमारे साथ बने रहें!

सुझाव भेजें

Chromium के इंजीनियर, SXG को डिस्ट्रिब्यूट करने के बारे में आपका सुझाव, शिकायत या राय सुनना चाहते हैं. इसके लिए, webpackage-dev@chromium.org पर संपर्क करें. आपके पास स्पेसिफ़िकेशन की चर्चा में शामिल होने या टीम को बग की शिकायत करने का विकल्प भी है. आपके सुझाव, शिकायत या राय से, स्टैंडर्ड तय करने की प्रोसेस में काफ़ी मदद मिलेगी. साथ ही, इससे नीतियों को लागू करने में होने वाली समस्याओं को हल करने में भी मदद मिलेगी. धन्यवाद!