Keresőoptimalizálás (Seo)

Alapelv

i18n.site nem frissíti az egyoldalas architektúrát. A keresési indexelés megkönnyítése érdekében külön statikus oldal és sitemap.xml jön létre a bejárók számára.

Ha User-Agent -ját használja a keresőmotor bejárója, a kérést átirányítja a statikus oldalra 302 keresztül.

Statikus oldalakon használja link az oldal különböző nyelvi változataira mutató hivatkozások jelzésére, például :

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

Helyi nginx Konfiguráció

Vegyük példaként a .i18n/htm/main.yml konfigurációs fájlt a demóprojektben

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

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

cdn:
  v:
  jsd:

Kérjük, először módosítsa a fenti host: értékét a domain nevére, például xxx.com .

Ezután i18n.site -n , a statikus oldal az out/main/htm könyvtárban generálódik.

Természetesen más konfigurációs fájlokat is engedélyezhet, például először a main konfigurációjára hivatkozva létrehozhatja .i18n/htm/dist.package.json és .i18n/htm/dist.yml .

Ezután futtassa i18n.site -n -c dist , így a statikus oldal out/dist/htm -re lesz generálva.

nginx állítható be az alábbi konfigurációval.

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;

# Ne tárolja túl sokáig a szerver dolgozói szkripteket
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Hosszabb gyorsítótáridő beállítása más statikus erőforrásokhoz
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Állítsa be, hogy a bejáró melyik statikus fájlt használja kezdőlap bejegyzésként
  location = / {
    # Ha $botLang üres, az a beállított nyelvi elérési útnak megfelelő bejáró hozzáférést és átirányítást jelent
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Egyoldalas alkalmazáskonfiguráció
  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/;
  }
}

Állítsa Be Az Objektumtárolót Statikus Fájlok Feltöltéséhez

A statikus fájlok helyileg is előállíthatók, de elterjedtebb az objektumtárolóba való feltöltése.

Módosítsa out t -ra :

out:
  - s3

Ezután szerkessze ~/.config/i18n.site.yml , és adja hozzá a következő konfigurációt :

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

A konfigurációban módosítsa i18n.site host: az .i18n/htm/main.yml ben értékre, s3 alatt több objektumtároló is konfigurálható, és a region mező nem kötelező (sok objektumtárolónak nem kell beállítania ezt a mezőt).

Ezután futtassa i18n.site -n a projekt újbóli közzétételéhez.

Ha módosította ~/.config/i18n.site.yml , és újra fel szeretné tölteni, használja a következő parancsot a projekt gyökérkönyvtárában a feltöltési gyorsítótár törléséhez :

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

cloudflare Konfiguráció

A domain név a következő helyen található cloudflare .

Konverziós Szabályok

Adja hozzá a konverziós szabályokat az alábbiak szerint:

A szabály kódja a következő, kérjük, módosítsa az "i18n.site" kódot a domain nevére:

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

Gyorsítótárazási Szabályok

Adjon hozzá gyorsítótár-szabályokat az alábbiak szerint:

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

Átirányítási Szabályok

Állítsa be az átirányítási szabályokat az alábbiak szerint, kérjük, módosítsa az "i18n.site" kódot a domain nevére

(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 Válassza a dinamikus átirányítást, kérjük, módosítsa /en concat("/en",http.request.uri.path,".htm") átirányítási útvonalon arra az alapértelmezett nyelvre, amelyet a keresőmotorok használni szeretnének.

Baidu Intelligent Cloud Configuration

Ha szolgáltatásokat kell nyújtania Kínának, használhatja a Baidu Smart Cloud szolgáltatást .

Az adatok a Baidu Object Storage-ba töltődnek fel, és a Baidu Content Distribution Networkhöz kötődnek.

Ezután hozza létre a szkriptet a EdgeJS edge szolgáltatásban az alábbiak szerint

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
  // A válaszfejlécek beállíthatók hibakeresési kimenetre, például out.XXX = 'MSG';
})

Kattintson Debug , majd a Közzététel a teljes hálózaton elemre.

Speciális Használat: A Forgalom Elosztása Regionális Felbontás Alapján

Ha Kínában szeretne szolgáltatásokat nyújtani és cloudflare ingyenes nemzetközi forgalmat is szeretne, használhat DNS regionális felbontással.

Például a Huawei DNS ingyenes regionális elemzést biztosít, amellyel a szárazföldi kínai forgalom a Baidu Smart Cloudon, a nemzetközi forgalom pedig cloudflare keresztül haladhat.

A cloudflare konfigurációjában sok buktató található. Íme néhány megjegyzés :

A Domain Név Más DNS Ban Van Tárolva, Hogyan Kell Használni cloudflare

Először kössön egy tetszőleges tartománynevet cloudflare -hoz, majd SSL/TLS → egyéni tartománynév használatával társítsa a fő tartománynevet ehhez a tartománynévhez.

cloudflare R2 Nem Érhető El Egyéni Domain Néven Keresztül

Mivel a cloudflare objektumtároló R2 nem érhető el testreszabott tartománynévvel, a statikus fájlok elhelyezéséhez harmadik féltől származó objektumtárolót kell használni.

Itt példának backblaze.com a cloudflare ban tárolandó harmadik féltől származó objektumok összerendelését.

Hozzon létre egy gyűjtőt backblaze.com helyen, töltsön fel bármilyen fájlt, kattintson a fájl tallózásához, és kapja meg az Friendly URL domain nevet, ami itt f003.backblazeb2.com .

Módosítsa a domain nevet CNAME ről f003.backblazeb2.com -re cloudflare -nál, és engedélyezze a proxyt.

Módosítsa SSL -ből cloudflare t → titkosítási mód, állítsa Full re

Adja hozzá a konverziós szabályt az alábbiak szerint, tegye első helyre (az elsőnek van a legalacsonyabb prioritása):

Rewrite to válassza ki a dinamikus lehetőséget, és módosítsa your_bucketname concat("/file/your_bucketname",http.request.uri.path) -ben beállítást a gyűjtőhely nevére.

Ezenkívül a fenti cloudflare konverziós szabályban index.html file/your_bucketname/index.html -re változik, és a többi konfiguráció változatlan marad.