بهینه سازی موتورهای جستجو (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 به صورت زیر ایجاد کنید
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 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
تغییر می کند و سایر تنظیمات ثابت می مانند.