ریدایرکت 301 در nginx: www، HTTPS و آدرسهای قدیمی
ریدایرکت درست باعث میشود اعتبار سئوی آدرسهای قدیمی حفظ شود و کاربر همیشه به آدرس اصلی برسد. در nginx سریعترین روش return 301 است و rewrite فقط وقتی لازم است که بخشی از آدرس را تغییر میدهید.
۱HTTP به HTTPS
پرکاربردترین ریدایرکت. $request_uri مسیر و آرگومانها را حفظ میکند.
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}۲www به بدون www (یا برعکس)
فقط یکی از دو حالت باید نسخهٔ اصلی باشد؛ در غیر اینصورت گوگل محتوای تکراری میبیند. سرور دوم با گواهی SSL باید هر دو دامنه را پوشش دهد.
server {
listen 443 ssl;
http2 on;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
return 301 https://example.com$request_uri;
}۳انتقال یک صفحه به آدرس جدید
علامت = یعنی تطابق دقیق و سریعترین حالت است.
location = /old-page {
return 301 /new-page;
}
location = /about-us.html {
return 301 https://example.com/about;
}۴تغییر ساختار آدرس با rewrite
برای انتقال یک بخش کامل مثل /blog/ به /articles/. عبارتهای داخل پرانتز با $1 در مقصد استفاده میشوند و permanent معادل کد 301 است.
rewrite ^/blog/(.*)$ /articles/$1 permanent;
# حذف پسوند .html
rewrite ^/(.+)\.html$ /$1 permanent;
# حذف اسلش انتهایی
rewrite ^/(.*)/$ /$1 permanent;پیش از فعال کردن هر rewrite مطمئن شوید حلقهٔ بیپایان (redirect loop) نمیسازد. با curl -I آن را تست کنید.
۵ریدایرکتهای گروهی با map
اگر دهها آدرس قدیمی دارید، map تمیزتر و سریعتر از دهها location است. map را در بلوک http بگذارید.
# /etc/nginx/conf.d/redirects.conf
map $request_uri $new_uri {
default "";
/old-products /products;
/about-us.html /about;
/contact.php /contact;
~^/category/(.*)$ /categories/$1;
}
# در server block
if ($new_uri != "") {
return 301 $new_uri;
}۶تغییر دامنه (انتقال کل سایت به دامنهٔ جدید)
همهٔ آدرسها را با حفظ مسیر به دامنهٔ جدید منتقل کنید تا سئو حفظ شود. در Google Search Console هم «تغییر آدرس» را ثبت کنید.
server {
listen 80;
listen 443 ssl;
http2 on;
server_name old-domain.com www.old-domain.com;
ssl_certificate /etc/letsencrypt/live/old-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/old-domain.com/privkey.pem;
return 301 https://new-domain.com$request_uri;
}۷تست ریدایرکتها
با curl مسیر ریدایرکت را قدمبهقدم ببینید. -L دنبال کردن و -I فقط هدر را نشان میدهد.
sudo nginx -t && sudo systemctl reload nginx
curl -sI http://www.example.com/old-page | grep -i -E 'HTTP|location'
curl -sIL http://example.com | grep -i -E 'HTTP|location'پرسشهای پرتکرار دربارهٔ ریدایرکت 301 در nginx: www، HTTPS و آدرسهای قدیمی
تفاوت 301 و 302 چیست؟
301 ریدایرکت دائمی است و گوگل اعتبار آدرس قدیم را به آدرس جدید منتقل میکند. 302 موقت است و آدرس قدیمی در نتایج باقی میماند. برای انتقال دائمی همیشه 301 (یا 308) بزنید.
return بهتر است یا rewrite؟
return سریعتر، سادهتر و امنتر است. فقط وقتی به الگو و بخشهای متغیر آدرس نیاز دارید از rewrite استفاده کنید.