Pengoptimuman Enjin Carian (Seo)

Prinsip

i18n.site menggunakan seni bina halaman tunggal tanpa muat semula Untuk memudahkan pengindeksan carian, halaman statik yang berasingan dan sitemap.xml akan dijana untuk perangkak.

Apabila User-Agent permintaan akses digunakan oleh perangkak enjin carian, permintaan akan diubah hala ke halaman statik melalui 302 .

Pada halaman statik, gunakan link untuk menunjukkan pautan ke versi bahasa yang berbeza halaman ini, seperti :

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

Konfigurasi nginx Tempatan

Ambil fail konfigurasi .i18n/htm/main.yml dalam projek demo sebagai contoh

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

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

cdn:
  v:
  jsd:

Sila ubah suai nilai host: di atas dahulu kepada nama domain anda, seperti xxx.com .

Kemudian, i18n.site -n , halaman statik akan dijana dalam out/main/htm direktori.

Sudah tentu, anda juga boleh mendayakan fail konfigurasi lain, seperti pertama merujuk kepada konfigurasi main untuk mencipta .i18n/htm/dist.package.json dan .i18n/htm/dist.yml .

Kemudian jalankan i18n.site -n -c dist supaya halaman statik akan dijana kepada out/dist/htm .

nginx boleh ditetapkan dengan merujuk kepada konfigurasi di bawah.

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;

# Jangan cache skrip pekerja pelayan terlalu lama
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Tetapkan masa cache yang lebih lama untuk sumber statik lain
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Tetapkan fail statik yang digunakan perangkak sebagai entri halaman utama
  location = / {
    # Jika $botLang tidak kosong, ini bermakna akses perangkak dan ubah hala mengikut laluan bahasa yang ditetapkan
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Konfigurasi aplikasi halaman tunggal
  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/;
  }
}

Konfigurasikan Storan Objek Untuk Memuat Naik Fail Statik

Fail statik boleh dijana secara tempatan, tetapi pendekatan yang lebih biasa ialah memuat naiknya ke storan objek.

Ubah suai out yang dikonfigurasikan di atas kepada :

out:
  - s3

Kemudian, edit ~/.config/i18n.site.yml dan tambah konfigurasi berikut :

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

Dalam konfigurasi, sila tukar i18n.site kepada nilai host: dalam .i18n/htm/main.yml , pelbagai stor objek boleh dikonfigurasikan di bawah s3 , dan medan region adalah pilihan (banyak kedai objek tidak perlu menetapkan medan ini).

Kemudian jalankan i18n.site -n untuk menerbitkan semula projek.

Jika anda telah mengubah suai ~/.config/i18n.site.yml dan ingin memuat naik semula, sila gunakan arahan berikut dalam direktori akar projek untuk mengosongkan cache muat naik :

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

Konfigurasi cloudflare

Nama domain dihoskan kepada cloudflare

Peraturan Penukaran

Tambahkan peraturan penukaran seperti yang ditunjukkan di bawah:

Kod peraturan adalah seperti berikut, sila ubah suai kod "i18n.site" kepada nama domain anda:

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

Peraturan Caching

Tambahkan peraturan cache seperti berikut:

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

Peraturan Ubah Hala

Tetapkan peraturan ubah hala seperti berikut, sila ubah suai kod "i18n.site" kepada nama domain anda

(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 ubah hala dinamik, sila ubah suai /en dalam laluan ubah hala concat("/en",http.request.uri.path,".htm") kepada bahasa lalai yang anda mahu enjin carian disertakan.

Konfigurasi Awan Pintar Baidu

Jika anda perlu menyediakan perkhidmatan ke tanah besar China, anda boleh menggunakan Baidu Smart Cloud .

Data dimuat naik ke Penyimpanan Objek Baidu dan terikat kepada Rangkaian Pengedaran Kandungan Baidu.

Kemudian buat skrip dalam perkhidmatan EdgeJS seperti berikut

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
  // Pengepala respons boleh ditetapkan untuk nyahpepijat output, seperti keluar.XXX = 'MSG';
})

Klik Debug , kemudian klik Terbitkan ke seluruh rangkaian.

Penggunaan Lanjutan: Edarkan Trafik Berdasarkan Resolusi Serantau

Jika anda ingin menyediakan perkhidmatan di tanah besar China dan juga mahukan cloudflare trafik antarabangsa percuma, anda boleh menggunakan DNS dengan resolusi serantau.

Contohnya, Huawei Cloud DNS menyediakan analisis serantau percuma, yang mana trafik tanah besar China boleh melalui Baidu Smart Cloud, dan trafik antarabangsa boleh melalui cloudflare .

Terdapat banyak perangkap dalam konfigurasi cloudflare Berikut adalah beberapa perkara yang perlu diperhatikan :

Nama Domain Dihoskan Dalam DNS Lain, Cara Menggunakan cloudflare

Pertama, ikat nama domain sewenang-wenangnya kepada cloudflare , dan kemudian gunakan SSL/TLS → nama domain tersuai untuk mengaitkan nama domain utama dengan nama domain ini.

cloudflare R2 Tidak Boleh Diakses Melalui Nama Domain Tersuai

Oleh kerana storan objek cloudflare dalam R2 tidak boleh diakses oleh nama domain tersuai, storan objek pihak ketiga perlu digunakan untuk meletakkan fail statik.

Di sini kita ambil backblaze.com sebagai contoh untuk menunjukkan cara mengikat objek pihak ketiga untuk disimpan pada cloudflare .

Buat baldi pada backblaze.com , muat naik mana-mana fail, klik untuk menyemak imbas fail dan dapatkan nama domain Friendly URL , iaitu f003.backblazeb2.com di sini.

Tukar nama domain daripada CNAME kepada f003.backblazeb2.com pada cloudflare dan dayakan proksi.

Ubah suai cloudflare daripada SSL → mod penyulitan, tetapkan kepada Full

Tambahkan peraturan penukaran seperti yang ditunjukkan di bawah, letakkan dahulu (yang pertama mempunyai keutamaan paling rendah):

Rewrite to pilih dinamik dan ubah suai your_bucketname dalam concat("/file/your_bucketname",http.request.uri.path) kepada nama baldi anda.

Selain itu, dalam peraturan penukaran cloudflare di atas, index.html ditukar kepada file/your_bucketname/index.html dan konfigurasi lain kekal sama.