فارسی (Farsi)
€EUR

ریدایرکت‌های 301 و 302 در Nginx روی Linux VPS

3 min
سرور مجازی (VPS/VDS)

وقتی صفحه‌ای جابه‌جا می‌شود، دامنه را عوض می‌کنید یا 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 پردازش را بلافاصله متوقف می‌کند.

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

rewrite را فقط وقتی به کار ببرید که لازم است بخشی از آدرس را با عبارت منظم بگیرید:

Nginx
rewrite ^/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) را ویرایش کنید:

Nginx
1server { 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 بفرستید:

Nginx
1server { 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 برقرار است.

🔗 از آدرس قدیمی به آدرس جدید

برای چند صفحه از تطابق دقیق (=) استفاده کنید که سریع‌ترین است:

Nginx
location = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }

و برای پوشه‌ای کامل که جابه‌جا شده و زیرمسیرهایش حفظ می‌شوند:

Nginx
location /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }

🏠 ریدایرکت کل دامنه

وقتی old-example.com را کنار می‌گذارید و به example.com می‌روید، همهٔ مسیرها را حفظ کنید:

Nginx
1server { 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 نه.

Bash
sudo nginx -t sudo systemctl reload nginx

سپس سرآیندها را بدون دنبال‌کردن ریدایرکت بررسی کنید:

Bash
curl -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 آزمایش شده‌اند.

با آخرین پیشنهادها، تخفیف‌ها و تبلیغات ویژه به‌روز بمانید.

مشاهده تخفیف‌ها

ما از کوکی استفاده می‌کنیم

ما از کوکی‌های تحلیلی برای بهبود تجربه شما در سایت خود استفاده می‌کنیم. هیچ داده‌ای به اشخاص ثالث فروخته نمی‌شود. اطلاعات بیشتر در سیاست حفظ حریم خصوصی ما.