Arama Motoru Optimizasyonu (Seo)

Prensip

i18n.site yenilenmeyen tek sayfalı bir mimariyi benimser. Arama dizine eklemeyi kolaylaştırmak amacıyla, tarayıcıların taraması için ayrı bir statik sayfa ve sitemap.xml oluşturulacaktır.

Erişim isteğinin User-Agent arama motoru tarayıcısı tarafından kullanıldığında, istek 302 üzerinden statik sayfaya yönlendirilecektir.

Statik sayfalarda, bu sayfanın farklı dil sürümlerine olan bağlantıları belirtmek için link kullanın; örneğin :

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

Yerel nginx Yapılandırması

Örnek olarak demo projedeki .i18n/htm/main.yml konfigürasyon dosyasını alın

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

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

cdn:
  v:
  jsd:

Lütfen öncelikle yukarıdaki host: değerini alan adınızla değiştirin ( xxx.com gibi).

Daha sonra i18n.site -n , out/main/htm dizininde statik sayfa oluşturulacaktır.

Elbette, .i18n/htm/dist.package.json ve .i18n/htm/dist.yml oluşturmak için ilk önce main konfigürasyonuna başvurmak gibi diğer konfigürasyon dosyalarını da etkinleştirebilirsiniz.

Daha sonra i18n.site -n -c dist çalıştırın, böylece statik sayfa out/dist/htm olarak oluşturulur.

nginx aşağıdaki konfigürasyona başvurularak ayarlanabilir.

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;

# Sunucu çalışanı komut dosyalarını çok uzun süre önbelleğe almayın
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Diğer statik kaynaklar için daha uzun önbellek süreleri ayarlayın
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Tarayıcının ana sayfa girişi olarak hangi statik dosyayı kullanacağını ayarlayın
  location = / {
    # $botLang boş değilse, ayarlanan dil yoluna göre tarayıcı erişimi ve yönlendirme anlamına gelir
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Tek sayfalı uygulama yapılandırması
  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/;
  }
}

Statik Dosyaları Yüklemek Için Nesne Depolamayı Yapılandırma

Statik dosyalar yerel olarak oluşturulabilir ancak daha yaygın bir yaklaşım, bunları nesne depolama alanına yüklemektir.

Yukarıda yapılandırılan out : olarak değiştirin.

out:
  - s3

Daha sonra ~/.config/i18n.site.yml düzenleyin ve aşağıdaki konfigürasyonu ekleyin :

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

Yapılandırmada, lütfen i18n.site host: .i18n/htm/main.yml değeri olarak değiştirin, s3 altında birden fazla nesne deposu yapılandırılabilir ve region alanı isteğe bağlıdır (birçok nesne deposunun bu alanı ayarlamasına gerek yoktur).

Daha sonra projeyi yeniden yayınlamak için i18n.site -n çalıştırın.

~/.config/i18n.site.yml değiştirdiyseniz ve yeniden yüklemek istiyorsanız, lütfen yükleme önbelleğini temizlemek için proje kök dizininde aşağıdaki komutu kullanın :

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

Bulut Parlaması Yapılandırması

Alan adı cloudflare .

Dönüşüm Kuralları

Dönüşüm kurallarını aşağıda gösterildiği gibi ekleyin:

Kural kodu aşağıdaki gibidir, lütfen "i18n.site" kodunu alan adınız olarak değiştirin:

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

Önbelleğe Alma Kuralları

Önbellek kurallarını aşağıdaki gibi ekleyin:

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

Yönlendirme Kuralları

Yönlendirme kurallarını aşağıdaki gibi ayarlayın, lütfen "i18n.site" kodunu alan adınıza göre değiştirin.

(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 Dinamik yeniden yönlendirmeyi seçin, lütfen yönlendirme yolu concat("/en",http.request.uri.path,".htm") /en , arama motorlarının dahil etmesini istediğiniz varsayılan dile değiştirin.

Baidu Akıllı Bulut Yapılandırması

Çin ana karasına hizmet sağlamanız gerekiyorsa Baidu Smart Cloud'u kullanabilirsiniz.

Veriler Baidu Nesne Depolamaya yüklenir ve Baidu İçerik Dağıtım Ağına bağlanır.

Daha sonra EdgeJS edge hizmetinde betiği aşağıdaki gibi oluşturun.

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
  // Yanıt başlıkları çıktıda hata ayıklamak için out.XXX = 'MSG'; gibi ayarlanabilir.
})

Debug ve ardından Tüm ağa yayınla'ya tıklayın.

Gelişmiş Kullanım: Trafiği Bölgesel Çözünürlüğe Göre Dağıtın

Çin ana karasında hizmet vermek ve aynı zamanda cloudflare ücretsiz uluslararası trafik istiyorsanız, DNS bölgesel çözünürlükle kullanabilirsiniz.

Örneğin, Huawei Cloud DNS Çin ana karasındaki trafiğin Baidu Smart Cloud'dan geçebileceği ve uluslararası trafiğin cloudflare geçebileceği ücretsiz bölgesel analiz sağlar.

cloudflare konfigürasyonunda pek çok tuzak vardır. Burada dikkat edilmesi gereken birkaç nokta var :

Alan Adı Diğer DNS Barındırılıyor, Nasıl Kullanılır cloudflare

Önce rastgele bir alan adını cloudflare bağlayın ve ardından ana alan adını bu alan adıyla ilişkilendirmek için SSL/TLS → özel alan adını kullanın.

cloudflare R2 Özel Bir Alan Adı Aracılığıyla Erişilemez

cloudflare nesne deposuna R2 özelleştirilmiş bir etki alanı adı ile erişilemediğinden, statik dosyaları yerleştirmek için üçüncü taraf bir nesne deposunun kullanılması gerekir.

Burada, üçüncü taraf nesnelerinin nasıl bağlanacağını ve cloudflare nasıl depolanacağını göstermek için backblaze.com örnek olarak alıyoruz.

backblaze.com konumunda bir paket oluşturun, herhangi bir dosyayı yükleyin, dosyaya göz atmak için tıklayın ve burada f003.backblazeb2.com olan Friendly URL alan adını alın.

Alan adını cloudflare CNAME f003.backblazeb2.com değiştirin ve proxy'yi etkinleştirin.

cloudflare / SSL değiştirin → şifreleme modunu Full ayarlayın

Dönüşüm kuralını aşağıda gösterildiği gibi ekleyin, ilk sıraya koyun (ilki en düşük önceliğe sahiptir):

Rewrite to Dinamik'i seçin ve your_bucketname concat("/file/your_bucketname",http.request.uri.path) arada'yı paket adınızla değiştirin.

Ayrıca yukarıdaki cloudflare dönüşüm kuralında index.html , file/your_bucketname/index.html olarak değiştirilmekte, diğer konfigürasyonlar aynı kalmaktadır.