Tối Ưu Hóa Công Cụ Tìm Kiếm (Seo)

Nguyên Tắc

i18n.site sử dụng kiến trúc một trang không làm mới để tạo điều kiện thuận lợi cho việc lập chỉ mục tìm kiếm, một trang tĩnh riêng biệt và sitemap.xml sẽ được tạo để trình thu thập thông tin thu thập thông tin.

Khi User-Agent của yêu cầu truy cập được trình thu thập thông tin của công cụ tìm kiếm sử dụng, yêu cầu sẽ được chuyển hướng đến trang tĩnh thông qua 302 .

Trên các trang tĩnh, sử dụng link để biểu thị các liên kết đến các phiên bản ngôn ngữ khác nhau của trang này, chẳng hạn như :

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

Cấu Hình nginx Cục Bộ

Lấy file cấu hình .i18n/htm/main.yml trong dự án demo làm ví dụ

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

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

cdn:
  v:
  jsd:

Trước tiên hãy sửa đổi giá trị host: ở trên thành tên miền của bạn, chẳng hạn như xxx.com .

Sau đó, i18n.site -n , trang tĩnh sẽ được tạo trong thư mục out/main/htm .

Tất nhiên, bạn cũng có thể kích hoạt các file cấu hình khác, chẳng hạn như trước tiên hãy tham khảo cấu hình main để tạo .i18n/htm/dist.package.json.i18n/htm/dist.yml .

Sau đó chạy i18n.site -n -c dist để trang tĩnh được tạo thành out/dist/htm .

nginx có thể được thiết lập bằng cách tham khảo cấu hình bên dưới.

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;

# Không lưu trữ các tập lệnh chạy của máy chủ quá lâu
  location = /S.js {
    add_header Cache-Control "max-age=600";
  }

# Đặt thời gian bộ đệm dài hơn cho các tài nguyên tĩnh khác
  location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
    add_header Cache-Control "max-age=999999";
  }

# Đặt tệp tĩnh mà trình thu thập thông tin sử dụng làm mục nhập trang chủ
  location = / {
    # Nếu $botLang không trống, điều đó có nghĩa là trình thu thập thông tin truy cập và chuyển hướng theo đường dẫn ngôn ngữ đã đặt
    if ($botLang) {
        return 301 $botLang/flashduty.htm;
    }
    add_header Cache-Control "max-age=600";
    rewrite ^ /index.html break;
  }

# Cấu hình ứng dụng một trang
  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/;
  }
}

Định Cấu Hình Lưu Trữ Đối Tượng Để Tải Lên Các Tệp Tĩnh

Các tệp tĩnh có thể được tạo cục bộ, nhưng cách tiếp cận phổ biến hơn là tải chúng lên bộ lưu trữ đối tượng.

Sửa đổi out được định cấu hình ở trên thành :

out:
  - s3

Sau đó, chỉnh sửa ~/.config/i18n.site.yml và thêm cấu hình sau :

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

Trong cấu hình, vui lòng thay đổi i18n.site thành giá trị host: trong .i18n/htm/main.yml , nhiều cửa hàng đối tượng có thể được định cấu hình trong s3 và trường region là tùy chọn (nhiều cửa hàng đối tượng không cần đặt trường này).

Sau đó chạy i18n.site -n để xuất bản lại dự án.

Nếu bạn đã sửa đổi ~/.config/i18n.site.yml và muốn tải lên lại, vui lòng sử dụng lệnh sau trong thư mục gốc của dự án để xóa bộ đệm tải lên :

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

Cấu Hình Đám Mây

Tên miền được lưu trữ cloudflare .

Quy Tắc Chuyển Đổi

Thêm các quy tắc chuyển đổi như dưới đây:

Mã quy tắc như sau, vui lòng sửa đổi mã "i18n.site" thành tên miền của bạn:

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

Quy Tắc Bộ Nhớ Đệm

Thêm quy tắc bộ đệm như sau:

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

Quy Tắc Chuyển Hướng

Đặt quy tắc chuyển hướng như sau, vui lòng sửa đổi mã "i18n.site" thành tên miền của bạn

(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 Chọn chuyển hướng động, vui lòng sửa đổi /en trong đường dẫn chuyển hướng concat("/en",http.request.uri.path,".htm") thành ngôn ngữ mặc định mà bạn muốn công cụ tìm kiếm đưa vào.

Cấu Hình Đám Mây Thông Minh Của Baidu

Nếu bạn cần cung cấp dịch vụ cho Trung Quốc đại lục, bạn có thể sử dụng Baidu Smart Cloud .

Dữ liệu được tải lên Bộ lưu trữ đối tượng Baidu và được liên kết với Mạng phân phối nội dung Baidu.

Sau đó tạo tập lệnh trong dịch vụ cạnh EdgeJS

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
  // Tiêu đề phản hồi có thể được đặt thành đầu ra gỡ lỗi, chẳng hạn như out.XXX = 'MSG';
})

Bấm vào Debug , sau đó bấm Xuất bản lên toàn bộ mạng.

Cách Sử Dụng Nâng Cao: Phân Phối Lưu Lượng Truy Cập Dựa Trên Độ Phân Giải Khu Vực

Nếu bạn muốn cung cấp dịch vụ ở Trung Quốc đại lục và cũng muốn có cloudflare lưu lượng truy cập quốc tế miễn phí, bạn có thể sử dụng DNS với độ phân giải khu vực.

Ví dụ: Huawei Cloud DNS cung cấp phân tích khu vực miễn phí, trong đó lưu lượng truy cập của Trung Quốc đại lục có thể đi qua Đám mây thông minh của Baidu và lưu lượng truy cập quốc tế có thể đi qua cloudflare .

Có rất nhiều cạm bẫy trong cấu hình của cloudflare Dưới đây là một số điểm cần lưu ý :

Tên Miền Được Lưu Trữ Ở DNS Khác, Cách Sử Dụng cloudflare

Trước tiên, liên kết một tên miền tùy ý với cloudflare , sau đó sử dụng SSL/TLS → tên miền tùy chỉnh để liên kết tên miền chính với tên miền này.

cloudflare R2 Không Thể Được Truy Cập Thông Qua Tên Miền Tùy Chỉnh

Bởi vì tên miền tùy cloudflare không thể truy cập bộ lưu trữ đối tượng tích hợp R2 nên bộ lưu trữ đối tượng của bên thứ ba cần được sử dụng để đặt các tệp tĩnh.

Ở đây chúng tôi lấy backblaze.com làm ví dụ để minh họa cách liên kết các đối tượng của bên thứ ba và lưu trữ chúng vào cloudflare .

Tạo một nhóm tại backblaze.com , tải lên bất kỳ tệp nào, nhấp để duyệt tệp và nhận tên miền Friendly URL , tức là f003.backblazeb2.com tại đây.

Thay đổi tên miền từ CNAME thành f003.backblazeb2.com thành cloudflare và kích hoạt proxy.

Sửa đổi cloudflare trên SSL → chế độ mã hóa, đặt thành Full

Thêm quy tắc chuyển đổi như hình bên dưới, đặt trước (quy tắc đầu tiên có mức độ ưu tiên thấp nhất):

Rewrite to chọn động và sửa đổi your_bucketname trong concat("/file/your_bucketname",http.request.uri.path) thành tên nhóm của bạn.

Ngoài ra, trong quy tắc chuyển đổi cloudflare ở trên, index.html được đổi thành file/your_bucketname/index.html , các cấu hình khác vẫn giữ nguyên.