Pengoptimalan Mesin Pencari (Seo)
Prinsip
i18n.site
mengadopsi arsitektur halaman tunggal non-refresh. Untuk memfasilitasi pengindeksan pencarian, halaman statis terpisah dan sitemap.xml
akan dibuat untuk dirayapi oleh crawler.
Ketika User-Agent
permintaan akses digunakan oleh crawler mesin pencari, permintaan tersebut akan dialihkan ke halaman statis melalui 302
.
Pada halaman statis, gunakan link
untuk menunjukkan link ke versi bahasa berbeda pada 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 Lokal
Ambil file konfigurasi .i18n/htm/main.yml
di proyek demo sebagai contoh
host: i18n-demo.github.io
seo: true
out:
- fs
pkg:
i: i18n.site
md: i18n.site
cdn:
v:
jsd:
Silakan ubah terlebih dahulu nilai host:
di atas ke nama domain Anda, misalnya xxx.com
.
Kemudian, i18n.site -n
, halaman statis akan dibuat di direktori out/main/htm
.
Tentu saja, Anda juga dapat mengaktifkan file konfigurasi lainnya, seperti merujuk terlebih dahulu ke konfigurasi main
untuk membuat .i18n/htm/dist.package.json
dan .i18n/htm/dist.yml
.
Kemudian jalankan i18n.site -n -c dist
sehingga halaman statis akan dihasilkan menjadi out/dist/htm
.
nginx
dapat diatur dengan mengacu pada konfigurasi di bawah ini.
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 menyimpan skrip pekerja server dalam cache terlalu lama
location = /S.js {
add_header Cache-Control "max-age=600";
}
# Tetapkan waktu cache yang lebih lama untuk sumber daya statis lainnya
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 file statis mana yang digunakan perayap sebagai entri beranda
location = / {
# Jika $botLang tidak kosong, berarti akses crawler dan pengalihan sesuai dengan jalur bahasa yang ditetapkan
if ($botLang) {
return 301 $botLang/flashduty.htm;
}
add_header Cache-Control "max-age=600";
rewrite ^ /index.html break;
}
# Konfigurasi aplikasi satu halaman
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 Penyimpanan Objek Untuk Mengunggah File Statis
File statis dapat dibuat secara lokal, namun pendekatan yang lebih umum adalah mengunggahnya ke penyimpanan objek.
Ubah out
yang dikonfigurasi di atas menjadi :
out:
- s3
Kemudian, edit ~/.config/i18n.site.yml
dan tambahkan 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, harap ubah i18n.site
ke nilai host:
di .i18n/htm/main.yml
, beberapa penyimpanan objek dapat dikonfigurasi di bawah s3
, dan bidang region
bersifat opsional (banyak penyimpanan objek tidak perlu menyetel bidang ini).
Kemudian jalankan i18n.site -n
untuk menerbitkan ulang proyek.
Jika Anda telah memodifikasi ~/.config/i18n.site.yml
dan ingin mengunggah ulang, silakan gunakan perintah berikut di direktori root proyek untuk menghapus cache unggahan :
rm -rf .i18n/data/seo .i18n/data/public
Konfigurasi cloudflare
Nama domain dihosting ke cloudflare
Aturan Konversi
Tambahkan aturan konversi seperti yang ditunjukkan di bawah ini:
Kode aturannya adalah sebagai berikut, silakan ubah kode "i18n.site" menjadi 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")
)
Aturan Cache
Tambahkan aturan cache sebagai 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")
Aturan Pengalihan
Tetapkan aturan pengalihan sebagai berikut, silakan ubah kode "i18n.site" menjadi 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 pengalihan dinamis, harap ubah /en
di jalur pengalihan concat("/en",http.request.uri.path,".htm")
ke bahasa default yang Anda ingin sertakan oleh mesin pencari.
Konfigurasi Cloud Cerdas Baidu
Jika Anda perlu menyediakan layanan ke daratan Tiongkok, Anda dapat menggunakan Baidu Smart Cloud .
Data diunggah ke Baidu Object Storage dan terikat ke Jaringan Distribusi Konten Baidu.
Kemudian buat script di EdgeJS edge service 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
// Header respons dapat diatur untuk men-debug output, seperti out.XXX = 'MSG';
})
Klik Debug
, lalu klik Publikasikan ke seluruh jaringan.
Penggunaan Lanjutan: Mendistribusikan Lalu Lintas Berdasarkan Resolusi Regional
Jika Anda ingin menyediakan layanan di Tiongkok daratan dan juga ingin cloudflare
lalu lintas internasional gratis, Anda dapat menggunakan DNS
dengan resolusi regional.
Misalnya, Huawei Cloud DNS menyediakan analisis regional gratis, yang dengannya lalu lintas Tiongkok daratan dapat melewati Baidu Smart Cloud, dan lalu lintas internasional dapat melewati cloudflare
.
Ada banyak kendala dalam konfigurasi cloudflare
Berikut beberapa hal yang perlu diperhatikan :
Nama Domain Dihosting Di DNS
Lainnya, Cara Menggunakan cloudflare
Pertama, ikat nama domain arbitrer ke cloudflare
, lalu gunakan SSL/TLS
→ nama domain khusus untuk mengaitkan nama domain utama ke nama domain ini.
cloudflare R2
Tidak Dapat Diakses Melalui Nama Domain Khusus
Karena penyimpanan objek cloudflare
R2
tidak dapat diakses dengan nama domain yang disesuaikan, penyimpanan objek pihak ketiga perlu digunakan untuk menempatkan file statis.
Di sini kita mengambil backblaze.com sebagai contoh untuk mendemonstrasikan cara mengikat objek pihak ketiga untuk disimpan di cloudflare
.
Buat keranjang di backblaze.com
, unggah file apa pun, klik untuk menelusuri file, dan dapatkan nama domain Friendly URL
, yaitu f003.backblazeb2.com
di sini.
Ubah nama domain dari CNAME
menjadi f003.backblazeb2.com
pada cloudflare
dan aktifkan proxy.
Ubah cloudflare
dari SSL
→ mode enkripsi, atur ke Full
Tambahkan aturan konversi seperti yang ditunjukkan di bawah ini, letakkan di urutan pertama (yang pertama memiliki prioritas terendah):
Rewrite to
pilih dinamis dan ubah your_bucketname
in concat("/file/your_bucketname",http.request.uri.path)
ke nama bucket Anda.
Selain itu, pada aturan konversi cloudflare
di atas, index.html
diubah menjadi file/your_bucketname/index.html
, dan konfigurasi lainnya tetap sama.