Поисковая Оптимизация (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 и привязываются к сети распространения контента 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
, а другие конфигурации остаются прежними.