Sichmotoroptimiséierung (Seo)

Prinzip

i18n.site adoptéiert eng eenzeg Säitarchitektur déi net erfrëscht ass Fir d'Sichindexéierung ze erliichteren, gëtt eng separat statesch Säit an sitemap.xml generéiert fir Crawler ze kräischen.

Wann User-Agent vun der Zougangsufro vum Sichmotor Crawler benotzt gëtt, gëtt d'Ufro iwwer 302 op déi statesch Säit ëmgeleet.

Op statesche Säiten benotzt link fir Linken op verschidde Sproochversioune vun dëser Säit unzeginn, wéi z :

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

Lokal nginx Konfiguratioun

Huelt d' .i18n/htm/main.yml Konfiguratiounsdatei am Demo-Projet als Beispill

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

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

cdn:
  v:
  jsd:

Ännert w.e.g. als éischt de Wäert vun host: uewen op Ärem Domain Numm, wéi xxx.com .

Dann, i18n.site -n , gëtt déi statesch Säit am out/main/htm Verzeichnis generéiert.

Natierlech kënnt Dir och aner Konfiguratiounsdateien aktivéieren, wéi zum Beispill d'éischt op d'Konfiguratioun vun main ze referenzéieren fir .i18n/htm/dist.package.json an .i18n/htm/dist.yml ze kreéieren.

Dann lafen i18n.site -n -c dist sou datt déi statesch Säit op out/dist/htm generéiert gëtt.

nginx kann agestallt ginn andeems Dir op d'Konfiguratioun hei drënner kuckt.

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;

# Cache Server Aarbechter Scripte net ze laang
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Setzt méi laang Cachezäite fir aner statesch Ressourcen
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Setzt wéi eng statesch Datei de Crawler als Homepage-Entrée benotzt
  location = / {
    # Wann $botLang
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Single Säit Applikatioun Configuratioun
  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/;
  }
}

Konfiguréieren Objektlagerung Fir Statesch Dateien Eropzelueden

Statesch Dateie kënnen lokal generéiert ginn, awer eng méi allgemeng Approche ass se op d'Objetlagerung eropzelueden.

Ännert out uewe konfiguréiert op :

out:
  - s3

Dann, ännert ~/.config/i18n.site.yml a füügt déi folgend Konfiguratioun derbäi :

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

An der Konfiguratioun, ännert w.e.g. i18n.site op de Wäert vun host: an .i18n/htm/main.yml , verschidde Objektgeschäfter kënnen ënner s3 konfiguréiert ginn, an de region Feld ass fakultativ (vill Objektgeschäfter brauchen net dëst Feld ze setzen).

Da lafen i18n.site -n fir de Projet nei ze publizéieren.

Wann Dir ~/.config/i18n.site.yml geännert hutt a wëllt nei eroplueden, benotzt w.e.g. de folgende Kommando am Projet Root Verzeechnes fir den Upload Cache ze läschen :

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

cloudflare Configuratioun

Domain Numm gehost cloudflare .

Konversioun Regelen

Füügt d'Konversiounsregele wéi hei ënnendrënner:

De Regelcode ass wéi follegt, ännert w.e.g. de Code "i18n.site" op Ären Domain Numm:

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

Cache Regelen

Füügt Cache Regele wéi follegt:

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

Redirect Regelen

Setzt d'Redirectiounsregele wéi follegt, ännert w.e.g. de Code "i18n.site" op Ären Domain Numm

(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 Wielt dynamesch Viruleedung, ännert w.e.g. /en am Viruleedungswee concat("/en",http.request.uri.path,".htm") op d'Standardsprooch déi Dir wëllt Sichmotoren enthalen.

Baidu Intelligent Cloud Configuratioun

Wann Dir Servicer op Festland China ubidden musst, kënnt Dir Baidu Smart Cloud benotzen.

D'Donnéeë ginn op Baidu Object Storage eropgelueden an un Baidu Content Distribution Network gebonnen.

Erstellt dann de Skript an 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
  // Äntwert Header kënnen op Debug Output gesat ginn, sou wéi out.XXX = 'MSG';
})

Klickt Debug , klickt dann op Publizéieren an de ganze Netz.

Fortgeschratt Benotzung: Verdeelen Traffic Baséiert Op Regional Resolutioun

Wann Dir Servicer am Festland China ubidden wëllt an och cloudflare gratis internationale Verkéier wëllt, kënnt Dir DNS mat regionaler Resolutioun benotzen.

Zum Beispill, Huawei DNS stellt gratis regional Analyse, mat deem Festland Chinese Traffic kann duerch Baidu Smart Cloud goen, an international Verkéier kann duerch cloudflare goen.

Et gi vill Falen an der Konfiguratioun vun cloudflare Hei sinn e puer Punkten ze notéieren :

Den Domain Numm Gëtt an Aner DNS Gehost, Wéi Benotzt cloudflare

Bindt als éischt en arbiträren Domain Numm un cloudflare , a benotzt dann SSL/TLS → Benotzerdefinéiert Domain Numm fir den Haapt Domain Numm un dësen Domain Numm ze associéieren.

cloudflare R2 Kann Net Iwwer E Personaliséierten Domain Numm Zougänglech Sinn

Well déi agebauten cloudflare R2 net vun engem personaliséierten Domain Numm zougänglech ass, muss eng Drëtt Partei Objektlagerung benotzt ginn fir statesch Dateien ze placéieren.

backblaze.com huelen mir e Beispill fir ze demonstréieren wéi d'Objete vun Drëtt Parteien op cloudflare gelagert ginn.

Erstellt en Eemer bei backblaze.com , lued all Datei erop, klickt fir d'Datei ze duerchsichen, a kritt den Domain Numm vun Friendly URL , deen f003.backblazeb2.com hei ass.

Ännert den Domain Numm vun CNAME op f003.backblazeb2.com bei cloudflare an aktivéiert de Proxy.

Änneren cloudflare vun SSL → Verschlësselungsmodus, op Full gesat

Füügt d'Konversiounsregel un wéi hei ënnendrënner, setzt se als éischt (déi éischt huet déi niddregst Prioritéit):

Rewrite to wielt dynamesch a ännert your_bucketname an concat("/file/your_bucketname",http.request.uri.path) op Ären Eemernumm.

Zousätzlech, an der cloudflare Konversiounsregel hei uewen, gëtt index.html op file/your_bucketname/index.html geännert, an aner Konfiguratiounen bleiwen déiselwecht.