تحافظ إعادة التوجيه على زوارك وترتيبك في محركات البحث عندما تنتقل صفحة إلى عنوان جديد، أو تغيّر النطاق، أو تفرض 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 يوقف المعالجة فورًا.
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 ... ? أو وجهة ثابتة تختفي المعاملات. استخدم $request_uri في return أو أبقِ $args صراحةً.
الكتلة الخطأ هي التي تردّ. يختار Nginx الكتلة بحسب server_name. اعرضها بالأمر sudo nginx -T | grep server_name وابحث عن التكرار.
🎉 إعادة التوجيه لديك تعمل الآن: دائمة حيث يكون النقل نهائيًا، ومؤقتة حيث لا يكون، ومختبرة بـ curl قبل أن يلاحظ زوارك أي شيء.