Search Engine Optimization (Seo)

Prinsip

i18n.site nganggo arsitektur kaca tunggal sing ora refresh Kanggo nggampangake indeksasi telusuran, kaca statis sing kapisah lan sitemap.xml bakal digawe kanggo crawler.

Nalika User-Agent saka panjalukan akses digunakake dening crawler mesin telusur, panyuwunan kasebut bakal dialihake menyang kaca statis liwat 302 .

Ing kaca statis, gunakake link kanggo nuduhake pranala menyang macem-macem versi basa kaca iki, kayata :

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

Konfigurasi nginx Lokal

Njupuk file konfigurasi .i18n/htm/main.yml ing proyek demo minangka conto

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

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

cdn:
  v:
  jsd:

Mangga ngowahi nilai host: ing ndhuwur dadi jeneng domain sampeyan, kayata xxx.com .

Banjur, i18n.site -n , kaca statis bakal digawe ing out/main/htm direktori.

Mesthi, sampeyan uga bisa ngaktifake file konfigurasi liyane, kayata pisanan ngrujuk menyang konfigurasi main kanggo nggawe .i18n/htm/dist.package.json lan .i18n/htm/dist.yml .

Banjur mbukak i18n.site -n -c dist supaya kaca statis bakal diasilake dadi out/dist/htm .

nginx bisa disetel kanthi ngrujuk menyang konfigurasi ing ngisor iki.

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;

# Aja cache skrip buruh server kanggo dawa banget
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Setel wektu cache sing luwih dawa kanggo sumber daya statis liyane
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Setel file statis sing digunakake crawler minangka entri homepage
  location = / {
    # Yen $botLang ora kosong, tegese akses crawler lan pangalihan miturut path basa sing disetel
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Konfigurasi aplikasi siji kaca
  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/;
  }
}

Ngatur Panyimpenan Obyek Kanggo Ngunggah File Statis

File statis bisa digawe sacara lokal, nanging pendekatan sing luwih umum yaiku ngunggah menyang panyimpenan obyek.

Owahi out sing dikonfigurasi ing ndhuwur dadi :

out:
  - s3

Banjur, sunting ~/.config/i18n.site.yml lan tambahake konfigurasi ing ngisor iki :

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

Ing konfigurasi, mangga ngganti i18n.site kanggo nilai host: ing .i18n/htm/main.yml , macem-macem toko obyek bisa diatur ing s3 , lan lapangan region opsional (akeh toko obyek ora perlu nyetel lapangan iki).

Banjur mbukak i18n.site -n kanggo nerbitake maneh proyek kasebut.

Yen sampeyan wis ngowahi ~/.config/i18n.site.yml lan pengin ngunggah maneh, gunakake perintah ing ngisor iki ing direktori root project kanggo mbusak cache unggahan :

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

Konfigurasi cloudflare

Jeneng domain di-host kanggo cloudflare .

Aturan Konversi

Tambah aturan konversi kaya ing ngisor iki:

Kode aturane kaya ing ngisor iki, mangga ngowahi kode "i18n.site" dadi jeneng domain sampeyan:

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

Aturan Caching

Tambah aturan cache kaya ing ngisor iki:

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

Aturan Pangalihan

Setel aturan pangalihan minangka nderek, mangga ngowahi kode "i18n.site" kanggo jeneng domain

(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 Pilih pangalihan dinamis, mangga owahi /en ing jalur pangalihan concat("/en",http.request.uri.path,".htm") menyang basa standar sing pengin dilebokake mesin telusur.

Konfigurasi Cloud Intelligent Baidu

Yen sampeyan kudu nyedhiyakake layanan menyang daratan China, sampeyan bisa nggunakake Baidu Smart Cloud .

Data diunggah menyang Panyimpenan Obyek Baidu lan kaiket menyang Jaringan Distribusi Konten Baidu.

Banjur gawe skrip ing layanan EdgeJS kaya ing ngisor iki

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
  // Sampeyan bisa nyetel header respon kanggo debug output, kayata out.XXX = 'MSG';
})

Klik Debug , banjur klik Terbitake menyang kabeh jaringan.

Panggunaan Lanjut: Distribusi Lalu Lintas Adhedhasar Resolusi Regional

Yen sampeyan pengin nyedhiyakake layanan ing daratan China lan uga pengin cloudflare lalu lintas internasional gratis, sampeyan bisa nggunakake DNS kanthi resolusi regional.

Contone, Huawei Cloud DNS nyedhiyakake analisis regional gratis, sing lalu lintas Cina daratan bisa ngliwati Baidu Smart Cloud, lan lalu lintas internasional bisa ngliwati cloudflare .

Ana akeh pitfalls ing konfigurasi cloudflare Kene sawetara TCTerms kanggo Wigati :

Jeneng Domain Di-Host Ing DNS Liyane, Carane Nggunakake cloudflare

Kaping pisanan, ikatan jeneng domain sing sewenang-wenang menyang cloudflare , banjur gunakake SSL/TLS → jeneng domain khusus kanggo nggandhengake jeneng domain utama menyang jeneng domain iki.

cloudflare R2 Ora Bisa Diakses Liwat Jeneng Domain Khusus

Amarga panyimpenan obyek cloudflare dibangun ing R2 ora bisa diakses kanthi jeneng domain sing disesuaikan, panyimpenan obyek pihak katelu kudu digunakake kanggo nyelehake file statis.

Ing kene kita njupuk backblaze.com minangka conto kanggo nduduhake carane ngiket obyek pihak katelu lan nyimpen menyang cloudflare .

Nggawe ember ing backblaze.com , upload file sembarang, klik kanggo nelusur file, lan njaluk jeneng domain Friendly URL , kang f003.backblazeb2.com kene.

Ganti jeneng domain saka CNAME dadi f003.backblazeb2.com ing cloudflare lan aktifake proxy.

Ngowahi cloudflare saka SSL → mode enkripsi, disetel dadi Full

Tambah aturan konversi kaya sing kapacak ing ngisor iki, sijine dhisik (sing pisanan nduweni prioritas paling murah):

Rewrite to pilih dinamis lan ngowahi your_bucketname ing concat("/file/your_bucketname",http.request.uri.path) kanggo jeneng ember.

Kajaba iku, ing aturan konversi cloudflare ing ndhuwur, index.html diganti dadi file/your_bucketname/index.html , lan konfigurasi liyane tetep padha.