العربية

إعادة التوجيه 301 و302 في Nginx على Linux VPS

2 min
استضافة VPS/VDS

تحافظ إعادة التوجيه على زوارك وترتيبك في محركات البحث عندما تنتقل صفحة إلى عنوان جديد، أو تغيّر النطاق، أو تفرض HTTPS. يوضح هذا الدليل كيف تكتب إعادة توجيه نظيفة في Nginx على VPS Linux Infrawire الخاص بك، وكيف تختبرها قبل أن تصل إلى الإنتاج.

📋 المتطلبات

  • خادم 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 ... ? أو وجهة ثابتة تختفي المعاملات. استخدم $request_uri في return أو أبقِ $args صراحةً.

الكتلة الخطأ هي التي تردّ. يختار Nginx الكتلة بحسب server_name. اعرضها بالأمر sudo nginx -T | grep server_name وابحث عن التكرار.


🎉 إعادة التوجيه لديك تعمل الآن: دائمة حيث يكون النقل نهائيًا، ومؤقتة حيث لا يكون، ومختبرة بـ curl قبل أن يلاحظ زوارك أي شيء.

ابقَ على اطلاع بأحدث العروض والخصومات والعروض الترويجية الخاصة.

عرض العروض الترويجية

نستخدم ملفات تعريف الارتباط

نستخدم كوكيز تحليلية لتحسين تجربتك. لا نبيع البيانات لأطراف ثالثة. المزيد في سياسة الخصوصية.