ریدایرکت 301 در nginx: www، HTTPS و آدرس‌های قدیمی

ریدایرکت درست باعث می‌شود اعتبار سئوی آدرس‌های قدیمی حفظ شود و کاربر همیشه به آدرس اصلی برسد. در nginx سریع‌ترین روش return 301 است و rewrite فقط وقتی لازم است که بخشی از آدرس را تغییر می‌دهید.

وب‌سرور و SSLمقدماتی7 دقیقه

۱HTTP به HTTPS

پرکاربردترین ریدایرکت. $request_uri مسیر و آرگومان‌ها را حفظ می‌کند.

nginx
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

۲www به بدون www (یا برعکس)

فقط یکی از دو حالت باید نسخهٔ اصلی باشد؛ در غیر این‌صورت گوگل محتوای تکراری می‌بیند. سرور دوم با گواهی SSL باید هر دو دامنه را پوشش دهد.

nginx
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;
}

۳انتقال یک صفحه به آدرس جدید

علامت = یعنی تطابق دقیق و سریع‌ترین حالت است.

nginx
    location = /old-page {
        return 301 /new-page;
    }

    location = /about-us.html {
        return 301 https://example.com/about;
    }

۴تغییر ساختار آدرس با rewrite

برای انتقال یک بخش کامل مثل /blog/ به /articles/. عبارت‌های داخل پرانتز با $1 در مقصد استفاده می‌شوند و permanent معادل کد 301 است.

nginx
    rewrite ^/blog/(.*)$ /articles/$1 permanent;

    # حذف پسوند .html
    rewrite ^/(.+)\.html$ /$1 permanent;

    # حذف اسلش انتهایی
    rewrite ^/(.*)/$ /$1 permanent;

پیش از فعال کردن هر rewrite مطمئن شوید حلقهٔ بی‌پایان (redirect loop) نمی‌سازد. با curl -I آن را تست کنید.

۵ریدایرکت‌های گروهی با map

اگر ده‌ها آدرس قدیمی دارید، map تمیزتر و سریع‌تر از ده‌ها location است. map را در بلوک http بگذارید.

nginx
# /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 هم «تغییر آدرس» را ثبت کنید.

nginx
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 فقط هدر را نشان می‌دهد.

bash
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 استفاده کنید.