Search Engine Optimization (Seo)

Prensip

i18n.site adopte yon achitekti yon sèl paj ki pa rafrechi Pou fasilite rechèch la, yo pral pwodwi yon paj estatik separe ak sitemap.xml pou crawlers yo.

Lè crawler motè rechèch la itilize User-Agent demann aksè a, demann lan pral redireksyon sou paj estatik la atravè 302 .

Nan paj estatik, sèvi ak link pou endike lyen ki mennen nan diferan lang vèsyon paj sa a, tankou :

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

Konfigirasyon Lokal nginx

Pran fichye konfigirasyon .i18n/htm/main.yml nan pwojè Demo a kòm yon egzanp

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

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

cdn:
  v:
  jsd:

Tanpri premye modifye valè a nan host: pi wo a nan non domèn ou, tankou xxx.com .

Lè sa a, i18n.site -n , paj estatik la pral pwodwi nan anyè a out/main/htm .

Natirèlman, ou ka tou pèmèt lòt fichye konfigirasyon, tankou premye refere a konfigirasyon an nan main yo kreye .i18n/htm/dist.package.json ak .i18n/htm/dist.yml .

Lè sa a, kouri i18n.site -n -c dist pou paj estatik la pral pwodwi a out/dist/htm .

nginx ka mete lè w refere a konfigirasyon ki anba a.

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;

# Pa kache scripts travayè sèvè pou twò lontan
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Mete pi long tan kachèt pou lòt resous estatik
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Mete ki fichye estatik krole a itilize kòm antre nan paj dakèy la
  location = / {
    # Si $botLang pa vid, sa vle di aksè ak redireksyon crawler selon chemen lang lan
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Konfigirasyon aplikasyon yon sèl paj
  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/;
  }
}

Konfigure Depo Objè Pou Telechaje Fichye Estatik

Fichye estatik yo ka pwodwi lokalman, men yon apwòch ki pi komen se telechaje yo nan depo objè.

Modifye out ki konfigire pi wo a pou :

out:
  - s3

Lè sa a, modifye ~/.config/i18n.site.yml epi ajoute konfigirasyon sa a :

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

Nan konfigirasyon an, tanpri chanje i18n.site nan valè a nan host: nan .i18n/htm/main.yml , magazen objè miltip ka configuré anba s3 , ak jaden an region se opsyonèl (anpil magazen objè pa bezwen mete jaden sa a).

Lè sa a, kouri i18n.site -n pou repibliye pwojè a.

Si ou te modifye ~/.config/i18n.site.yml epi ou vle re-upload, tanpri itilize lòd sa a nan anyè rasin pwojè a pou netwaye kachèt upload la :

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

Konfigirasyon cloudflare

Non domèn akomode cloudflare

Règ Konvèsyon

Ajoute règ konvèsyon yo jan yo montre anba a:

Kòd règ la se jan sa a, tanpri modifye kòd la "i18n.site" nan non domèn ou:

(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")
)

Règ Kachèt

Ajoute règ kachèt jan sa a:

(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")

Règ Redireksyon

Mete règ yo redireksyon jan sa a, tanpri modifye kòd la "i18n.site" nan non domèn ou

(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 Chwazi redireksyon dinamik, tanpri modifye /en nan chemen redireksyon concat("/en",http.request.uri.path,".htm") nan lang default ou vle motè rechèch la genyen ladan li.

Baidu Entelijan Cloud Konfigirasyon

Si ou bezwen bay sèvis nan tè pwensipal Lachin, ou ka itilize Baidu Smart Cloud .

Done yo telechaje nan Depo objè Baidu epi yo mare nan Baidu Content Distribution Network.

Lè sa a, kreye script la nan sèvis EdgeJS jan sa a

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
  // Tèt repons yo ka mete debug pwodiksyon, tankou out.XXX = 'MSG';
})

Klike sou Debug , apresa klike sou Pibliye nan tout rezo a.

Itilizasyon Avanse: Distribye Trafik Ki Baze Sou Rezolisyon Rejyonal Yo

Si ou vle bay sèvis nan tè pwensipal Lachin epi tou vle cloudflare gratis trafik entènasyonal, ou ka itilize DNS ak rezolisyon rejyonal yo.

Pou egzanp, Huawei Cloud DNS bay analiz rejyonal gratis, ak ki trafik tè pwensipal Chinwa ka ale nan Baidu Smart Cloud, ak trafik entènasyonal ka ale nan cloudflare .

Gen anpil enkonvenyans nan konfigirasyon an nan cloudflare Men kèk pwen pou sonje :

Non Domèn Akomode Nan Lòt DNS , Kijan Pou Itilize cloudflare

Premyèman mare yon non domèn abitrè a cloudflare , epi sèvi ak SSL/TLS → non domèn koutim pou asosye non domèn prensipal la ak non domèn sa a.

cloudflare R2 Pa Ka Jwenn Aksè Atravè Yon Non Domèn Koutim

Paske bati cloudflare nan depo objè R2 pa ka jwenn aksè pa yon non domèn Customized, yon depo objè twazyèm-pati bezwen yo dwe itilize yo mete fichye estatik.

Isit backblaze.com nou pran kòm yon egzanp pou montre kouman yo mare objè twazyèm pati yo dwe estoke nan cloudflare .

Kreye yon bokit nan backblaze.com , telechaje nenpòt fichye, klike sou yo browse fichye a, epi jwenn non an domèn nan Friendly URL , ki se f003.backblazeb2.com isit la.

Chanje non domèn soti nan CNAME a f003.backblazeb2.com nan cloudflare epi pèmèt prokurasyon an.

Modifye cloudflare nan SSL → mòd chifreman, mete sou Full

Ajoute règ konvèsyon an jan yo montre anba a, mete l an premye (premye a gen priyorite ki pi ba a):

Rewrite to chwazi dinamik ak modifye your_bucketname nan concat("/file/your_bucketname",http.request.uri.path) nan non bokit ou.

Anplis de sa, nan règ konvèsyon cloudflare ki pi wo a, index.html chanje a file/your_bucketname/index.html , ak lòt konfigirasyon rete menm jan an.