Optimización De Motores De Búsqueda (Seo)
Principio
i18n.site
adopta una arquitectura de página única sin actualización Para facilitar la indexación de búsqueda, se generarán una página estática separada y sitemap.xml
para que los rastreadores la rastreen.
Cuando el rastreador del motor de búsqueda utiliza User-Agent
de la solicitud de acceso, la solicitud será redirigida a la página estática a través de 302
.
En páginas estáticas, utilice link
para indicar enlaces a versiones en diferentes idiomas de esta página, como :
<link rel=alternate hreflang=zh href="https://i18n.site/zh/.htm">
<link rel=alternate hreflang=en href="https://i18n.site/en/.htm">
Configuración Local De nginx
Tome el archivo de configuración .i18n/htm/main.yml
en el proyecto de demostración como ejemplo.
host: i18n-demo.github.io
seo: true
out:
- fs
pkg:
i: i18n.site
md: i18n.site
cdn:
v:
jsd:
Primero modifique el valor host:
anterior a su nombre de dominio, como xxx.com
.
Luego, i18n.site -n
, la página estática se generará en el directorio out/main/htm
.
Por supuesto, también puede habilitar otros archivos de configuración, como consultar primero la configuración de main
para crear .i18n/htm/dist.package.json
y .i18n/htm/dist.yml
.
Luego ejecute i18n.site -n -c dist
para que la página estática se genere en out/dist/htm
.
nginx
se puede configurar consultando la configuración siguiente.
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;
# No almacene en caché los scripts de los trabajadores del servidor durante demasiado tiempo
location = /S.js {
add_header Cache-Control "max-age=600";
}
# Establecer tiempos de caché más largos para otros 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";
}
# Establecer qué archivo estático utiliza el rastreador como entrada de la página de inicio
location = / {
# Si $botLang está vacío, significa acceso y redirección del rastreador según la ruta de idioma establecida.
if ($botLang) {
return 301 $botLang/flashduty.htm;
}
add_header Cache-Control "max-age=600";
rewrite ^ /index.html break;
}
# Configuración de la aplicación de una sola página
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 El Almacenamiento De Objetos Para Cargar Archivos Estáticos
Los archivos estáticos se pueden generar localmente, pero un enfoque más común es cargarlos en el almacenamiento de objetos.
Modifique out
configurado arriba a :
out:
- s3
Luego, edite ~/.config/i18n.site.yml
y agregue la siguiente configuración :
site:
i18n.site:
s3:
- endpoint: s3.eu-central-003.backblazeb2.com
ak: # access key
sk: # secret key
bucket: # bucket name
# region:
En la configuración, cambie i18n.site
al valor de host:
en .i18n/htm/main.yml
, se pueden configurar varios almacenes de objetos en s3
y el campo region
es opcional (muchos almacenes de objetos no necesitan configurar este campo).
Luego ejecute i18n.site -n
para volver a publicar el proyecto.
Si ha modificado ~/.config/i18n.site.yml
y desea volver a cargar, utilice el siguiente comando en el directorio raíz del proyecto para borrar el caché de carga :
rm -rf .i18n/data/seo .i18n/data/public
Configuración De Nube
Nombre de dominio alojado en cloudflare
Reglas De Conversión
Agregue las reglas de conversión como se muestra a continuación:
El código de regla es el siguiente, modifique el código "i18n.site" a su nombre de dominio:
(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")
)
Reglas De Almacenamiento en Caché
Agregue reglas de caché de la siguiente manera:
(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")
Reglas De Redireccionamiento
Configure las reglas de redirección de la siguiente manera, modifique el código "i18n.site" a su nombre de dominio.
(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
Seleccione la redirección dinámica, modifique /en
en la ruta de redirección concat("/en",http.request.uri.path,".htm")
al idioma predeterminado que desea que incluyan los motores de búsqueda.
Configuración Inteligente De La Nube De Baidu
Si necesita proporcionar servicios a China continental, puede utilizar Baidu Smart Cloud .
Los datos se cargan en Baidu Object Storage y se vinculan a Baidu Content Distribution Network.
Luego cree el script en el servicio EdgeJS de la siguiente manera.
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
// Los encabezados de respuesta se pueden configurar para depurar la salida, como out.XXX = 'MSG';
})
Haga clic en Debug
y luego haga clic en Publicar en toda la red.
Uso Avanzado: Distribuya El Tráfico Según La Resolución Regional
Si desea brindar servicios en China continental y también desea cloudflare
tráfico internacional gratuito, puede usar DNS
con resolución regional.
Por ejemplo, Huawei Cloud DNS proporciona un análisis regional gratuito, con el que el tráfico de China continental puede pasar por Baidu Smart Cloud y el tráfico internacional puede pasar por cloudflare
.
Hay muchas trampas en la configuración de cloudflare
¡Aquí hay algunos puntos a tener en cuenta :
El Nombre De Dominio Está Alojado en Otro DNS
, Cómo Usarlo cloudflare
Primero vincule un nombre de dominio arbitrario a cloudflare
y luego use SSL/TLS
→ nombre de dominio personalizado para asociar el nombre de dominio principal a este nombre de dominio.
No Se Puede Acceder a cloudflare R2
a Través De Un Nombre De Dominio Personalizado
Debido a que no se puede acceder al almacenamiento de objetos cloudflare
R2
mediante un nombre de dominio personalizado, se debe utilizar un almacenamiento de objetos de terceros para colocar archivos estáticos.
Aquí tomamos backblaze.com como ejemplo para demostrar cómo vincular objetos de terceros para que se almacenen en cloudflare
.
Cree un depósito en backblaze.com
, cargue cualquier archivo, haga clic para explorar el archivo y obtenga el nombre de dominio de Friendly URL
, que aquí es f003.backblazeb2.com
.
Cambie el nombre de dominio de CNAME
a f003.backblazeb2.com
en cloudflare
y habilite el proxy.
Modificar cloudflare
de SSL
→ modo de cifrado, establecido en Full
Agregue la regla de conversión como se muestra a continuación, colóquela primero (la primera tiene la prioridad más baja):
Rewrite to
seleccione dinámico y modifique your_bucketname
en concat("/file/your_bucketname",http.request.uri.path)
al nombre de su depósito.
Además, en la regla de conversión cloudflare
anterior, index.html
se cambia a file/your_bucketname/index.html
y otras configuraciones siguen siendo las mismas.