النشر من مجلد غير public_html
افتراضيًا ينشر النطاق public_html في مجلد المنزل الخاص بك. أطر PHP
الحديثة مبنية بالعكس: يعيش التطبيق في مجلد واحد
ويُقصَد أن يكون مجلد public/ الفرعي داخله فقط قابلًا للوصول من الويب.
ملف .env — كلمة مرور قاعدة البيانات ومفتاح التطبيق وبيانات اعتماد الدفع —
يقع مستوى واحدًا فوقه، عمدًا.
إن نشرتَ المشروع كله بدلًا من ذلك، فسيكون /.env عنوان URL يمكن لأي شخص طلبه.
اختيار جذر المستند هو كيفية تجنّب ذلك.
اضبطه
النطاقات ← صف النطاق ← جذر المستند.
يُطلب منك مجلد داخل مجلد منزلك، مكتوبًا نسبةً إليه:
app/public
لا /home/you/app/public. اتركه فارغًا للعودة إلى public_html.
تُنشئ اللوحة المجلد إن لم يكن موجودًا بعد، وتعيد كتابة إعداد خادم الويب وتعيد تحميله. عند الانتهاء تُخبرك بالمسار الكامل الذي تنشره الآن، وتقول ذلك صراحةً إن اضطرت إلى إنشاء المجلد.
تخطيط نموذجي بعد ذلك:
/home/you/
├── app/ <- the whole project: composer.json, .env, vendor/
│ └── public/ <- the only part served to the web
└── public_html/ <- the default, no longer used
تحقّق من أنها نجحت
حمّل الموقع. ثم اطلب الملف الذي كنت تحميه:
curl -sI https://yourdomain.com/.env
403 هو الجواب الذي تريده. أما 200 فيعني أن جذر المستند لا يزال فوق
.env وأن التغيير لم يُطبَّق — أعِد تحميل صفحة النطاقات وتأكّد
من أن الصف يُظهر المجلد الذي كتبته.
أيّ النطاقات لديه هذا
- النطاق الأساسي والنطاقات الإضافية والنطاقات الفرعية لكلٍّ جذر مستند خاص به وزرّ جذر المستند خاص به.
- النطاقات الموقوفة (الأسماء البديلة) ليس لديها. الاسم البديل يُقدّم دائمًا موقعك الأساسي، وهذا ما يجعله اسمًا بديلًا. تقول اللوحة ذلك: "النطاق الموقوف يُقدّم دائمًا موقعك الأساسي. غيّر جذر المستند الأساسي بدلًا من ذلك، أو حوّل هذا إلى نطاق إضافي."
- إعادات التوجيه ليس لديها. إعادة التوجيه لا تُقدّم شيئًا خاصًا بها.
ما ترفضه اللوحة، ولماذا
تُفحَص القيمة قبل أن تصل إلى أي شيء ذي امتياز، وتُفحَص مجددًا على الجانب الآخر. تعود الرفوضات كرسالة على الصفحة، ولا يتغيّر شيء.
| ما كتبته | لماذا يُرفَض |
|---|---|
/var/www/html، ~/app |
يجب أن يكون نسبةً إلى منزلك. المسارات المطلقة و~ غير مقبولة. |
../../etc، app/../.. |
لا يجوز أن يبدأ اسم مجلد بنقطة، وهذا ما يجعل .. مستحيلًا. لا شيء خارج منزلك قابل للوصول، بحكم البناء. |
.ssh، .git، .config |
نفس القاعدة. نشر .ssh يضع مفاتيحك على الويب؛ ونشر .git يضع تاريخ مصدرك هناك. |
tmp |
ملفات جلسة PHP الخاصة بك تعيش هناك. نشره يعني نشر جلسات زوّارك. |
logs، etc، mail، ssl، backups |
تستخدمها اللوحة لحسابك. |
a/b/c/d/e |
أربعة مستويات عمقًا على الأكثر. |
| أي شيء يتجاوز 128 حرفًا | طويل جدًا. |
يحدث فحص إضافي واحد على الخادم نفسه: يُحلّ المجلد عبر أي
روابط رمزية ويُعاد فحصه. الرابط الرمزي المشير إلى خارج منزلك يُرفَض
بدلًا من اتّباعه، فلا يتحوّل ln -s / ~/app إلى نظام ملفات مُقدَّم.
الشهادات
لا شيء تفعله. تُصدَر الشهادة لـالنطاق، لا للمجلد، وتُعاد قراءة جذر المستند الذي ضبطته لحظة كتابة الشهادة — لذا تغييره أثناء إعداد HTTPS آمن. النطاق الإضافي الذي لديه بالفعل HTTPS يحتفظ به.
عندما يبدو شيء ما خاطئًا
يُظهر الموقع قائمة مجلد أو "index of /". المجلد الجديد ليس فيه
index.php أو index.html بعد. ارفع التطبيق، أو وجِّه
جذر المستند إلى المجلد الذي يحتوي واحدًا.
403 على كل صفحة، لا على .env فقط. المجلد موجود لكن خادم الويب
لا يستطيع القراءة داخله. تحقّق بمدير الملفات من أن المجلد ومجلداته الأصلية
تعود إلى حسابك، خاصةً إن كنت قد وضعت الملفات هناك عبر SSH
كمستخدم آخر.
404 على كل صفحة والموقع كان يعمل قبل دقيقة. أعِد تحميل صفحة النطاقات
واقرأ المجلد المعروض في الصف. المطبعة تُنشَر بالضبط كما كُتبت
— تُنشئ اللوحة المجلد بدلًا من التخمين، فالمجلد الجديد الفارغ هو
السبب المعتاد. أعِده إلى public_html، أو إلى المجلد الصحيح.
تُعيد كل صفحة 500 مع خطأ إطار عن مفتاح مفقود. ذلك
هو التطبيق، لا جذر المستند — يجري الوصول إلى الإطار. لـ
Laravel يكون هذا عادةً APP_KEY فارغًا.