खोज इंजन अनुकूलन (एसईओ)

सिद्धांत

i18n.site खोज अनुक्रमण की सुविधा के लिए एक गैर-ताज़ा एकल पृष्ठ आर्किटेक्चर को अपनाता है, क्रॉलर्स को क्रॉल करने के लिए एक अलग स्थिर पृष्ठ और sitemap.xml उत्पन्न किया जाएगा।

जब खोज इंजन क्रॉलर द्वारा एक्सेस अनुरोध के User-Agent का उपयोग किया जाता है, तो अनुरोध को 302 के माध्यम से स्थिर पृष्ठ पर पुनः निर्देशित किया जाएगा।

स्थिर पृष्ठों पर, इस पृष्ठ के विभिन्न भाषा संस्करणों के लिंक को इंगित करने के लिए link उपयोग करें, जैसे :

<link rel=alternate hreflang=zh href="https://i18n.site/zh/.htm">
<link rel=alternate hreflang=en href="https://i18n.site/en/.htm">

स्थानीय nginx कॉन्फ़िगरेशन

उदाहरण के तौर पर डेमो प्रोजेक्ट में .i18n/htm/main.yml कॉन्फ़िगरेशन फ़ाइल लें

host: i18n-demo.github.io
seo: true
out:
  - fs

pkg:
  i: i18n.site
  md: i18n.site

cdn:
  v:
  jsd:

कृपया पहले अपने डोमेन नाम में ऊपर दिए गए host: के मान को संशोधित करें, जैसे कि xxx.com

फिर, i18n.site -n , out/main/htm निर्देशिका में स्थिर पृष्ठ तैयार किया जाएगा।

बेशक, आप अन्य कॉन्फ़िगरेशन फ़ाइलों को भी सक्षम कर सकते हैं, जैसे कि .i18n/htm/dist.package.json और .i18n/htm/dist.yml बनाने के लिए पहले main के कॉन्फ़िगरेशन का संदर्भ लेना।

फिर i18n.site -n -c dist चलाएँ ताकि स्थिर पृष्ठ out/dist/htm पर उत्पन्न हो जाए।

nginx नीचे दिए गए कॉन्फ़िगरेशन का संदर्भ देकर सेट किया जा सकता है।

map $http_user_agent $botLang {
  "~*baidu|yisou|sogou|360|byte" "/zh";
  "~*facebookexternalhit|slurp|bot|spider|curl" "/en";
  default "";
}

server {
  http2 on;
  listen 443 quic ;
  listen 443 ssl ;
  listen [::]:443 quic ;
  listen [::]:443 ssl ;

  add_header Alt-Svc 'h3=":443";ma=99999;persist=1';

  server_name doc.flashduty.com;

  ssl_certificate /root/.acme.sh/doc.flashduty.com_ecc/fullchain.cer;
  ssl_certificate_key /root/.acme.sh/doc.flashduty.com_ecc/doc.flashduty.com.key;

  root /mnt/doc.flashduty.com;

# सर्वर वर्कर स्क्रिप्ट को बहुत लंबे समय तक कैश न रखें
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# अन्य स्थैतिक संसाधनों के लिए लंबे समय तक कैश समय निर्धारित करें
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# सेट करें कि क्रॉलर होमपेज प्रविष्टि के रूप में किस स्थिर फ़ाइल का उपयोग करता है
  location = / {
    # यदि $botLang खाली नहीं है, तो इसका अर्थ है सेट भाषा पथ के अनुसार क्रॉलर पहुंच और पुनर्निर्देशन
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# एकल पृष्ठ अनुप्रयोग कॉन्फ़िगरेशन
  location / {
    if ($botLang) {
      return 302 $botLang$request_uri.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }
}

server {
  server_name doc.flashduty.com;
  listen      80;
  listen      [::]:80 ;
  location    / {
    rewrite ^(.+) https://$host$1 permanent;
  }
  location /.well-known/acme-challenge/ {
    root /mnt/doc.flashduty.com/;
  }
}

स्थिर फ़ाइलें अपलोड करने के लिए ऑब्जेक्ट संग्रहण कॉन्फ़िगर करें

स्टेटिक फ़ाइलें स्थानीय रूप से उत्पन्न की जा सकती हैं, लेकिन अधिक सामान्य तरीका उन्हें ऑब्जेक्ट स्टोरेज पर अपलोड करना है।

ऊपर कॉन्फ़िगर किए गए out संशोधित करें :

out:
  - s3

फिर, ~/.config/i18n.site.yml संपादित करें और निम्न कॉन्फ़िगरेशन जोड़ें :

site:
  i18n.site:
    s3:
      - endpoint: s3.eu-central-003.backblazeb2.com
        ak: # access key
        sk: # secret key
        bucket: # bucket name
        # region:

कॉन्फ़िगरेशन में, कृपया i18n.site host: में .i18n/htm/main.yml के मान में बदलें, एकाधिक ऑब्जेक्ट स्टोर्स को s3 अंतर्गत कॉन्फ़िगर किया जा सकता है, और region फ़ील्ड वैकल्पिक है (कई ऑब्जेक्ट स्टोर्स को इस फ़ील्ड को सेट करने की आवश्यकता नहीं है)।

फिर प्रोजेक्ट को पुनः प्रकाशित करने के लिए i18n.site -n चलाएँ।

यदि आपने ~/.config/i18n.site.yml संशोधित किया है और पुनः अपलोड करना चाहते हैं, तो कृपया अपलोड कैश को साफ़ करने के लिए प्रोजेक्ट रूट निर्देशिका में निम्नलिखित कमांड का उपयोग करें :

rm -rf .i18n/data/seo .i18n/data/public

क्लाउडफ्लेयर कॉन्फ़िगरेशन

डोमेन नाम होस्ट किया गया cloudflare

रूपांतरण नियम

नीचे दिखाए अनुसार रूपांतरण नियम जोड़ें:

नियम कोड इस प्रकार है, कृपया अपने डोमेन नाम में "i18n.site" कोड को संशोधित करें:

(http.host in {"i18n.site"}) and not (
substring(http.request.uri.path,-3) in {".js" ".gz"} or
substring(http.request.uri.path,-4) in {".htm" ".rss" ".css" ".svg" ".ico" ".png" ".xml" ".txt"} or
substring(http.request.uri.path,-5) in {".html" ".avif" ".json"} or
ends_with(http.request.uri.path,".webmanifest")
)

कैशिंग नियम

कैश नियम इस प्रकार जोड़ें:

(substring(http.request.uri.path,-4) in {".htm" ".rss"}) or ends_with(http.request.uri.path,"/sitemap.xml") or ends_with(http.request.uri.path,".xml.gz")

पुनर्निर्देशन नियम

पुनर्निर्देशन नियमों को निम्नानुसार सेट करें, कृपया अपने डोमेन नाम में "i18n.site" कोड को संशोधित करें

(http.host in {"i18n.site"}) and not (
substring(http.request.uri.path,-3) in {".js" ".gz"} or
substring(http.request.uri.path,-4) in {".htm" ".rss" ".css" ".svg" ".ico" ".png" ".xml" ".txt"} or
substring(http.request.uri.path,-5) in {".html" ".avif" ".json"} or
ends_with(http.request.uri.path,".webmanifest")
) and (
http.user_agent wildcard "*bot*" or
http.user_agent wildcard "*spider*" or
http.user_agent wildcard "*facebookexternalhit*" or
http.user_agent wildcard "*slurp*" or
http.user_agent wildcard "curl*" or
http.user_agent wildcard "*InspectionTool*"
)

URL redirect डायनामिक पुनर्निर्देशन का चयन करें, कृपया पुनर्निर्देशन पथ concat("/en",http.request.uri.path,".htm") में /en उस डिफ़ॉल्ट भाषा में संशोधित करें जिसे आप खोज इंजन में शामिल करना चाहते हैं।

Baidu इंटेलिजेंट क्लाउड कॉन्फ़िगरेशन

यदि आपको मुख्य भूमि चीन को सेवाएं प्रदान करने की आवश्यकता है, तो आप Baidu स्मार्ट क्लाउड का उपयोग कर सकते हैं।

डेटा को Baidu ऑब्जेक्ट स्टोरेज पर अपलोड किया जाता है और Baidu सामग्री वितरण नेटवर्क से जोड़ा जाता है।

फिर निम्नानुसार EdgeJS एज सेवा में स्क्रिप्ट बनाएं

const uri = r.uri, p = uri.lastIndexOf(".");
if (
  p < 0 ||
  !"|js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest|".includes(
    "|" + uri.slice(p + 1) + "|",
  )
) {
  const ua = r.headersIn["User-Agent"].toLowerCase()
  if (/facebookexternalhit|slurp|bot|spider|curl/.test(ua)) {
    r.return(
      302,
      (/baidu|yisou|sogou|360|byte/.test(ua) ? "/zh" : "/en") + r.uri + ".htm",
    )
  } else {
    r.uri = "/index.html"
  }
}

r.respHeader(() => {
  const t = [], out = r.headersOut;
  ["Content-MD5", "Age", "Expires", "Last-Modified"].forEach(
    i => delete out[i]
  )
  r.rawHeadersOut.forEach(i => {
    const key = i[0].toLowerCase()
    if (key.startsWith("x-") || key.startsWith("ohc-")) {
      delete out[key]
    }
  })
  out["Cache-Control"] = "max-age=" + 9e5
  // आप आउटपुट को डीबग करने के लिए रिस्पॉन्स हेडर सेट कर सकते हैं, जैसे कि out.XXX = 'MSG';
})

Debug पर क्लिक करें, फिर संपूर्ण नेटवर्क पर प्रकाशित करें पर क्लिक करें।

उन्नत उपयोग: क्षेत्रीय रिज़ॉल्यूशन के आधार पर ट्रैफ़िक वितरित करें

यदि आप मुख्य भूमि चीन में सेवाएं प्रदान करना चाहते हैं और cloudflare निःशुल्क अंतर्राष्ट्रीय ट्रैफ़िक भी चाहते हैं, तो आप क्षेत्रीय रिज़ॉल्यूशन के साथ DNS उपयोग कर सकते हैं।

उदाहरण के लिए, हुआवेई DNS मुफ़्त क्षेत्रीय विश्लेषण प्रदान करता है, जिसके साथ मुख्य भूमि चीनी ट्रैफ़िक Baidu स्मार्ट क्लाउड के माध्यम से जा सकता है, और अंतर्राष्ट्रीय ट्रैफ़िक cloudflare के माध्यम से जा सकता है।

cloudflare के कॉन्फ़िगरेशन में कई खामियां हैं। यहां ध्यान देने योग्य कुछ बिंदु दिए गए हैं :

डोमेन नाम अन्य DNS में होस्ट किया गया है, cloudflare उपयोग कैसे करें

पहले एक मनमाने डोमेन नाम को cloudflare से बांधें, और फिर मुख्य डोमेन नाम को इस डोमेन नाम से जोड़ने के लिए SSL/TLS → कस्टम डोमेन नाम का उपयोग करें।

cloudflare R2 कस्टम डोमेन नाम के माध्यम से एक्सेस नहीं किया जा सकता है

क्योंकि cloudflare ऑब्जेक्ट स्टोरेज R2 अनुकूलित डोमेन नाम द्वारा एक्सेस नहीं किया जा सकता है, स्थिर फ़ाइलों को रखने के लिए एक तृतीय-पक्ष ऑब्जेक्ट स्टोरेज का उपयोग करने की आवश्यकता होती है।

यहां हम यह दिखाने के लिए एक उदाहरण के रूप में backblaze.com लेते हैं कि cloudflare पर संग्रहीत किए जाने वाले तृतीय-पक्ष ऑब्जेक्ट को कैसे बांधा जाए।

backblaze.com पर एक बकेट बनाएं, कोई भी फ़ाइल अपलोड करें, फ़ाइल ब्राउज़ करने के लिए क्लिक करें, और Friendly URL का डोमेन नाम प्राप्त करें, जो यहां f003.backblazeb2.com है।

cloudflare पर डोमेन नाम को CNAME से f003.backblazeb2.com में बदलें और प्रॉक्सी को सक्षम करें।

SSL में से cloudflare संशोधित करें → एन्क्रिप्शन मोड, Full पर सेट करें

जैसा कि नीचे दिखाया गया है, रूपांतरण नियम जोड़ें, इसे पहले रखें (पहले वाले की प्राथमिकता सबसे कम है):

Rewrite to डायनामिक का चयन करें और अपने बकेट नाम में your_bucketname इन concat("/file/your_bucketname",http.request.uri.path) संशोधित करें।

इसके अलावा, उपरोक्त cloudflare रूपांतरण नियम में, index.html को file/your_bucketname/index.html में बदल दिया गया है, और अन्य कॉन्फ़िगरेशन समान रहते हैं।