Otimização De Mecanismos De Pesquisa (Seo)
Princípio
i18n.site
adota uma arquitetura de página única sem atualização. Para facilitar a indexação de pesquisa, uma página estática separada e sitemap.xml
serão geradas para rastreamento dos rastreadores.
Quando User-Agent
da solicitação de acesso for utilizado pelo rastreador do mecanismo de busca, a solicitação será redirecionada para a página estática via 302
.
Em páginas estáticas, use link
para indicar links para versões desta página em diferentes idiomas, como :
<link rel=alternate hreflang=zh href="https://i18n.site/zh/.htm">
<link rel=alternate hreflang=en href="https://i18n.site/en/.htm">
Configuração Local Do nginx
Pegue o arquivo de configuração .i18n/htm/main.yml
no projeto de demonstração como exemplo
host: i18n-demo.github.io
seo: true
out:
- fs
pkg:
i: i18n.site
md: i18n.site
cdn:
v:
jsd:
Primeiro modifique o valor host:
acima para o seu nome de domínio, como xxx.com
.
Então, i18n.site -n
, a página estática será gerada no diretório out/main/htm
.
Claro, você também pode habilitar outros arquivos de configuração, como primeiro consultar a configuração de main
para criar .i18n/htm/dist.package.json
e .i18n/htm/dist.yml
.
Em seguida, execute i18n.site -n -c dist
para que a página estática seja gerada em out/dist/htm
.
nginx
pode ser definido consultando a configuração abaixo.
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;
# Não armazene em cache os scripts de trabalho do servidor por muito tempo
location = /S.js {
add_header Cache-Control "max-age=600";
}
# Defina tempos de cache mais longos para outros recursos estáticos
location ~* \.(js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest)$ {
add_header Cache-Control "max-age=999999";
}
# Defina qual arquivo estático o rastreador usa como entrada da página inicial
location = / {
# Se $botLang não estiver vazio, significa acesso e redirecionamento do rastreador de acordo com o caminho do idioma definido.
if ($botLang) {
return 301 $botLang/flashduty.htm;
}
add_header Cache-Control "max-age=600";
rewrite ^ /index.html break;
}
# Configuração de aplicativo de página única
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/;
}
}
Configurar O Armazenamento De Objetos Para Fazer Upload De Arquivos Estáticos
Arquivos estáticos podem ser gerados localmente, mas uma abordagem mais comum é carregá-los no armazenamento de objetos.
Modifique out
configurado acima para :
out:
- s3
Em seguida, edite ~/.config/i18n.site.yml
e adicione a seguinte configuração :
site:
i18n.site:
s3:
- endpoint: s3.eu-central-003.backblazeb2.com
ak: # access key
sk: # secret key
bucket: # bucket name
# region:
Na configuração, altere i18n.site
para o valor de host:
em .i18n/htm/main.yml
, vários armazenamentos de objetos podem ser configurados em s3
e o campo region
é opcional (muitos armazenamentos de objetos não precisam definir este campo).
Em seguida, execute i18n.site -n
para republicar o projeto.
Se você modificou ~/.config/i18n.site.yml
e deseja fazer upload novamente, use o seguinte comando no diretório raiz do projeto para limpar o cache de upload :
rm -rf .i18n/data/seo .i18n/data/public
Configuração Do cloudflare
Nome de domínio hospedado em cloudflare
Regras De Conversão
Adicione as regras de conversão conforme mostrado abaixo:
O código da regra é o seguinte, modifique o código "i18n.site" para o seu nome de domínio:
(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")
)
Regras De Cache
Adicione regras de cache da seguinte forma:
(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")
Regras De Redirecionamento
Defina as regras de redirecionamento da seguinte forma, modifique o código "i18n.site" para o seu nome de domínio
(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
Selecione o redirecionamento dinâmico, modifique /en
no caminho de redirecionamento concat("/en",http.request.uri.path,".htm")
para o idioma padrão que você deseja que os mecanismos de pesquisa incluam.
Configuração De Nuvem Inteligente Baidu
Se precisar fornecer serviços para a China continental, você pode usar o Baidu Smart Cloud .
Os dados são carregados no Baidu Object Storage e vinculados à Rede de distribuição de conteúdo do Baidu.
Em seguida, crie o script no serviço de EdgeJS da seguinte maneira.
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
// Os cabeçalhos de resposta podem ser configurados para saída de depuração, como out.XXX = 'MSG';
})
Clique em Debug
e em Publicar em toda a rede.
Uso Avançado: Distribua O Tráfego Com Base Na Resolução Regional
Se você deseja prestar serviços na China continental e também deseja cloudflare
tráfego internacional gratuito, pode usar DNS
com resolução regional.
Por exemplo, o Huawei DNS fornece análise regional gratuita, com a qual o tráfego da China continental pode passar pelo Baidu Smart Cloud e o tráfego internacional pode passar pelo cloudflare
.
Existem muitas armadilhas na configuração de cloudflare
Aqui estão alguns pontos a serem observados :
O Nome De Domínio Está Hospedado Em Outro DNS
, Como Usar cloudflare
Primeiro vincule um nome de domínio arbitrário a cloudflare
e, em seguida, use SSL/TLS
→ nome de domínio personalizado para associar o nome de domínio principal a este nome de domínio.
cloudflare R2
Não Pode Ser Acessado Através De Um Nome De Domínio Personalizado
Como o armazenamento de objetos cloudflare
R2
não pode ser acessado por um nome de domínio personalizado, um armazenamento de objetos de terceiros precisa ser usado para colocar arquivos estáticos.
Aqui tomamos backblaze.com como exemplo para demonstrar como vincular objetos de terceiros e armazená-los em cloudflare
.
Crie um bucket em backblaze.com
, carregue qualquer arquivo, clique para navegar no arquivo e obtenha o nome de domínio Friendly URL
, que é f003.backblazeb2.com
aqui.
Altere o nome de domínio de CNAME
para f003.backblazeb2.com
em cloudflare
e habilite o proxy.
Modifique cloudflare
de SSL
→ modo de criptografia, definido como Full
Adicione a regra de conversão conforme mostrado abaixo, coloque-a primeiro (a primeira tem a prioridade mais baixa):
Rewrite to
selecione dinâmico e modifique your_bucketname
em concat("/file/your_bucketname",http.request.uri.path)
para o nome do seu bucket.
Além disso, na regra de conversão cloudflare
acima, index.html
é alterado para file/your_bucketname/index.html
e as demais configurações permanecem as mesmas.