وقتی صفحهای جابهجا میشود، دامنه را عوض میکنید یا HTTPS را اجباری میکنید، ریدایرکتها بازدیدکنندگان و رتبهٔ شما در جستجو را حفظ میکنند. این راهنما نشان میدهد چگونه روی VPS Linux Infrawire خود ریدایرکتهای تمیز در Nginx بنویسید و پیش از رسیدن به محیط واقعی آنها را آزمایش کنید.
📋 پیشنیازها
- یک Linux VPS (Ubuntu 24.04 / Debian 12 یا AlmaLinux 9 / Rocky 9) با دسترسی SSH بهعنوان root. آدرس IP و گذرواژهٔ root را در بخش مشتری پیدا میکنید.
- Nginx نصبشده که دستکم یک سایت را سرو میکند (
sudo apt install nginxیاsudo dnf install nginx). - یک دامنه (
example.com) که رکوردهای DNS از نوع A/AAAA آن بهVPS_IPاشاره میکنند.
🧭 301 یا 302: کدام را انتخاب کنیم
- 301 (Moved Permanently): جابهجایی نهایی است. مرورگرها و موتورهای جستجو آن را در حافظهٔ نهان نگه میدارند و رتبه را به آدرس جدید منتقل میکنند.
- 302 (Found): جابهجایی موقت است (تعمیر و نگهداری، آزمون A/B). آدرس قدیمی همچنان مرجع میماند.
اگر مطمئن نیستید، اول 302 بگذارید: یک 301 اشتباه میتواند مدتها در حافظهٔ نهان مرورگرها بماند.
⚙️ return یا rewrite
return را ترجیح دهید: سریعتر و خواناتر است، چون Nginx پردازش را بلافاصله متوقف میکند.
Nginxlocation = /old-page { return 301 /new-page; }
rewrite را فقط وقتی به کار ببرید که لازم است بخشی از آدرس را با عبارت منظم بگیرید:
Nginxrewrite ^/blog/(\d+)/(.*)$ /articles/$2 permanent;
پرچم permanent کد 301 و redirect کد 302 میفرستد.
🌐 ریدایرکت از www به بدون www
یک بلاک server جداگانه بسازید که فقط ریدایرکت میکند. فایل /etc/nginx/sites-available/example.com (در Debian/Ubuntu) یا /etc/nginx/conf.d/example.com.conf (در AlmaLinux/Rocky) را ویرایش کنید:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name www.example.com; 5 return 301 $scheme://example.com$request_uri; 6}
برای جهت عکس، دو نام میزبان را با هم عوض کنید. $request_uri مسیر و رشتهٔ پرسوجو را حفظ میکند.
🔒 ریدایرکت از HTTP به HTTPS
پس از نصب گواهی، تمام ترافیک رمزنشده را به HTTPS بفرستید:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 return 301 https://example.com$request_uri; 6} 7 8server { 9 listen 443 ssl; 10 listen [::]:443 ssl; 11 http2 on; 12 server_name www.example.com; 13 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 14 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 15 return 301 https://example.com$request_uri; 16}
سایت اصلی سپس در بلاک سومی قرار میگیرد که روی پورت 443 با server_name example.com; گوش میدهد. توجه کنید که http2 on; به Nginx نسخهٔ 1.25.1 یا بالاتر نیاز دارد که در Ubuntu 24.04 برقرار است.
🔗 از آدرس قدیمی به آدرس جدید
برای چند صفحه از تطابق دقیق (=) استفاده کنید که سریعترین است:
Nginxlocation = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }
و برای پوشهای کامل که جابهجا شده و زیرمسیرهایش حفظ میشوند:
Nginxlocation /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }
🏠 ریدایرکت کل دامنه
وقتی old-example.com را کنار میگذارید و به example.com میروید، همهٔ مسیرها را حفظ کنید:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name old-example.com www.old-example.com; 5 return 301 https://example.com$request_uri; 6}
اگر دامنهٔ قدیمی HTTPS هم دارد، بلاک listen 443 ssl; متناظر را با گواهی خودش اضافه کنید، وگرنه مرورگرها پیش از ریدایرکت خطای گواهی نشان میدهند.
✅ آزمایش و بارگذاری مجدد ایمن
پیش از بارگذاری مجدد همیشه نحو را بررسی کنید. reload اتصالهای جاری را حفظ میکند اما restart نه.
Bashsudo nginx -t sudo systemctl reload nginx
سپس سرآیندها را بدون دنبالکردن ریدایرکت بررسی کنید:
Bashcurl -I http://www.example.com/old-page
خروجی مورد انتظار (خلاصه):
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/old-page
برای دنبالکردن کل زنجیره و دیدن هر مرحله از curl -IL http://www.example.com/old-page استفاده کنید. بهتر است فقط یک مرحله باشد: از زنجیرههایی مانند HTTP، سپس www، سپس HTTPS پرهیز کنید.
🛠️ عیبیابی
ریدایرکتهای بیشازحد (حلقه). یک قاعده با مقصد خودش تطابق پیدا میکند، اغلب چون پروکسی یا CDN پیشتر HTTPS را خاتمه داده است. سرآیند Location را با curl -I بررسی کنید و مطمئن شوید بلاک مقصد دوباره ریدایرکت نمیکند.
تغییر اثری ندارد. فایلی را ویرایش کردهاید که فعال نیست. در Debian/Ubuntu پیوند را در /etc/nginx/sites-enabled/ بررسی کنید، سپس sudo nginx -t و sudo systemctl reload nginx را اجرا کنید. مرورگرها 301 را هم کش میکنند: با curl یا پنجرهٔ خصوصی آزمایش کنید.
رشتهٔ پرسوجو از بین رفته است. با rewrite ... ? یا مقصد ثابت، پارامترها حذف میشوند. در return از $request_uri استفاده کنید یا $args را صریحاً نگه دارید.
بلاک اشتباه پاسخ میدهد. Nginx بلاک را بر اساس server_name انتخاب میکند. آنها را با sudo nginx -T | grep server_name فهرست کنید و دنبال موارد تکراری بگردید.
🎉 ریدایرکتهای شما فعال شدند: دائمی جایی که نهایی است، موقت جایی که نیست، و پیش از آنکه بازدیدکنندگان چیزی متوجه شوند با curl آزمایش شدهاند.