Пошукова Оптимізація (Seo)
Принцип
i18n.site
використовує односторінкову архітектуру, щоб полегшити пошукову індексацію, буде створено окрему статичну сторінку та sitemap.xml
для сканування.
Коли сканер пошукової системи використовує User-Agent
запиту доступу, запит буде перенаправлено на статичну сторінку через 302
.
На статичних сторінках використовуйте link
щоб позначити посилання на різні мовні версії цієї сторінки, наприклад :
<link rel=alternate hreflang=zh href="https://i18n.site/zh/.htm">
<link rel=alternate hreflang=en href="https://i18n.site/en/.htm">
Локальна Конфігурація nginx
Візьмемо для прикладу файл конфігурації .i18n/htm/main.yml
у демонстраційному проекті
host: i18n-demo.github.io
seo: true
out:
- fs
pkg:
i: i18n.site
md: i18n.site
cdn:
v:
jsd:
Спочатку змініть значення host:
вище для свого доменного імені, наприклад xxx.com
.
Тоді, i18n.site -n
, статична сторінка буде згенерована в каталозі out/main/htm
.
Звичайно, ви також можете ввімкнути інші файли конфігурації, наприклад, спочатку звернутися до конфігурації main
, щоб створити .i18n/htm/dist.package.json
і .i18n/htm/dist.yml
.
Потім запустіть i18n.site -n -c dist
, щоб статична сторінка була згенерована до out/dist/htm
.
nginx
можна встановити, звернувшись до наведеної нижче конфігурації.
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;
# Не кешуйте робочі сценарії сервера надто довго
location = /S.js {
add_header Cache-Control "max-age=600";
}
# Встановіть довший час кешування для інших статичних ресурсів
location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
add_header Cache-Control "max-age=999999";
}
# Встановіть, який статичний файл використовуватиме сканер як запис домашньої сторінки
location = / {
# Якщо $botLang не пусте, це означає доступ сканера та перенаправлення відповідно до встановленого мовного шляху
if ($botLang) {
return 301 $botLang/flashduty.htm;
}
add_header Cache-Control "max-age=600";
rewrite ^ /index.html break;
}
# Конфігурація програми на одній сторінці
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/;
}
}
Налаштувати Сховище Об’єктів Для Завантаження Статичних Файлів
Статичні файли можна створити локально, але більш поширеним підходом є завантаження їх у сховище об’єктів.
Змініть налаштований вище out
на :
out:
- s3
Потім відредагуйте ~/.config/i18n.site.yml
і додайте таку конфігурацію :
site:
i18n.site:
s3:
- endpoint: s3.eu-central-003.backblazeb2.com
ak: # access key
sk: # secret key
bucket: # bucket name
# region:
У конфігурації змініть i18n.site
на значення host:
в .i18n/htm/main.yml
, кілька сховищ об’єктів можна налаштувати під s3
, а поле region
є необов’язковим (багатьом сховищам об’єктів не потрібно встановлювати це поле).
Потім запустіть i18n.site -n
щоб повторно опублікувати проект.
Якщо ви змінили ~/.config/i18n.site.yml
і хочете повторно завантажити, скористайтеся наступною командою в кореневому каталозі проекту, щоб очистити кеш завантаження :
rm -rf .i18n/data/seo .i18n/data/public
Конфігурація cloudflare
Доменне ім'я розміщено на cloudflare
Правила Перетворення
Додайте правила перетворення, як показано нижче:
Код правила такий: будь ласка, змініть код "i18n.site" на ім'я свого домену:
(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")
)
Правила Кешування
Додайте правила кешу таким чином:
(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")
Правила Перенаправлення
Встановіть правила переспрямування, будь ласка, змініть код "i18n.site" на своє доменне ім'я
(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
Виберіть динамічне перенаправлення, будь ласка, змініть /en
у шляху перенаправлення concat("/en",http.request.uri.path,".htm")
на мову за умовчанням, яку потрібно включити в пошукові системи.
Конфігурація Інтелектуальної Хмари Baidu
Якщо вам потрібно надавати послуги материковому Китаю, ви можете використовувати Baidu Smart Cloud .
Дані завантажуються в Baidu Object Storage і зв’язуються з мережею розповсюдження вмісту Baidu.
Потім створіть сценарій у службі EdgeJS edge наступним чином
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
// Ви можете встановити заголовок відповіді для налагодження виводу, наприклад out.XXX = 'MSG';
})
Клацніть Debug
, а потім клацніть Опублікувати для всієї мережі.
Розширене Використання: Розподіл Трафіку На Основі Регіональної Роздільної Здатності
Якщо ви хочете надавати послуги в материковому Китаї, а також хочете cloudflare
безкоштовного міжнародного трафіку, ви можете використовувати DNS
з регіональним дозволом.
Наприклад, Huawei Cloud DNS забезпечує безкоштовний регіональний аналіз, за допомогою якого трафік материкового Китаю може проходити через Baidu Smart Cloud, а міжнародний трафік може проходити через cloudflare
.
Є багато підводних каменів у конфігурації cloudflare
Ось кілька моментів, на які слід звернути увагу :
Доменне Ім’я Розміщено В Іншому DNS
, Як Використовувати cloudflare
Спочатку прив’яжіть довільне доменне ім’я до cloudflare
, а потім скористайтеся SSL/TLS
→ спеціальне доменне ім’я, щоб пов’язати основне доменне ім’я з цим доменним іменем.
cloudflare R2
Не Можна Отримати Через Власне Доменне Ім’я
Оскільки до cloudflare
сховища об’єктів R2
неможливо отримати доступ за допомогою налаштованого доменного імені, для розміщення статичних файлів необхідно використовувати сховище об’єктів стороннього виробника.
Тут ми беремо приклад backblaze.com щоб продемонструвати, як прив’язати сторонні об’єкти до cloudflare
.
Створіть сегмент на backblaze.com
, завантажте будь-який файл, натисніть, щоб переглянути файл, і отримайте доменне ім’я Friendly URL
, яке тут є f003.backblazeb2.com
.
Змініть доменне ім’я з CNAME
на f003.backblazeb2.com
на cloudflare
і ввімкніть проксі.
Змінити cloudflare
із SSL
→ режим шифрування, встановити Full
Додайте правило перетворення, як показано нижче, поставте його першим (перше має найнижчий пріоритет):
Rewrite to
виберіть динамічний і змініть your_bucketname
в concat("/file/your_bucketname",http.request.uri.path)
назву свого відра.
Крім того, у наведеному вище правилі перетворення cloudflare
index.html
змінюється на file/your_bucketname/index.html
, а інші конфігурації залишаються незмінними.