it-swarm.dev

كيف يمكنني جعل هذا العمل التوجيهي try_files؟

أحاول أن أفهم كيف يعمل Nginx try_files التوجيه. يعمل Nginx على الخادم الخاص بي ويقدم الصفحة الافتراضية الموجودة في /usr/share/nginx/html/index.html.

ومع ذلك ، لدي صفحة HTML بسيطة موجودة في نظام الملفات في /var/www/test/index.html. لا يؤدي ملف التكوين التالي إلى الحصول على هذا الملف. أود أن أفهم لماذا لا ، وما التغيير الذي أحتاجه حتى يتم تقديمه.

هنا هو الجزء المناسب من default.conf:

server {
    listen       80;
    server_name  localhost;

    root  /var/www;
    try_files /test/index.html /;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
49
Jonah

خط try_files شائع جدًا والذي يمكن تطبيقه على حالتك هو

location / {
    try_files $uri $uri/ /test/index.html;
}

ربما تفهم الجزء الأول ، location / يطابق جميع المواقع ، ما لم يطابقها موقع أكثر تحديدًا ، مثل location /test فمثلا

الجزء الثاني (ال try_files) يعني عندما تتلقى URI يقابله هذا الحظر حاول $uri أولاً ، على سبيل المثال http://example.com/images/image.jpg سيحاول nginx التحقق مما إذا كان هناك ملف داخل /images مسمي image.jpg إذا وجدت فسوف تخدمها أولاً.

الشرط الثاني هو $uri/ وهذا يعني إذا لم تجد الشرط الأول $uri جرب URI كدليل ، على سبيل المثال http://example.com/images/ ، سوف يتحقق ngixn أولاً من وجود ملف يسمى images ، ثم لن يعثر عليه ، ثم ينتقل إلى الاختيار الثاني $uri/ ومعرفة ما إذا كان هناك دليل يسمى images ، فسيحاول تقديمه.

ملاحظة جانبية: إذا لم يكن لديك autoindex on من المحتمل أن تحصل على خطأ محظور 403 ، لأن قائمة الدليل محظورة بشكل افتراضي .

تحرير : لقد نسيت أن أذكر أنه إذا تم تحديد index ، فسيحاول nginx التحقق مما إذا كان الفهرس موجود داخل هذا المجلد قبل محاولة سرد الدليل.

الشرط الثالث /test/index.html يعتبر خيار الرجوع ، (تحتاج إلى استخدام خيارين على الأقل ، خيار واحد وتراجع) ، يمكنك استخدام أكبر قدر ممكن (لا تقرأ من قبل انقباض من قبل) ، سيبحث nginx عن الملف index.html داخل المجلد test وتقديمه إذا كان موجودًا.

إذا فشل الشرط الثالث أيضًا ، فسيخدم nginx صفحة الخطأ 404.

أيضا هناك شيء يسمى المواقع المسماة ، مثل هذا

location @error {
}

يمكنك الاتصال به مع try_files مثله

try_files $uri $uri/ @error;

نصيحة : إذا كان لديك شرطًا واحدًا فقط تريد تقديمه ، على سبيل المثال ، داخل المجلد images ، فأنت تريد فقط إما تقديم الصورة أو انتقل إلى خطأ 404 ، يمكنك كتابة خط مثل هذا

location /images {
    try_files $uri =404;
}

مما يعني إما تقديم الملف أو تقديم خطأ 404 ، لا يمكنك استخدام فقط $uri بها النفس بدون =404 لأنك بحاجة إلى خيار احتياطي.
يمكنك أيضًا اختيار رمز الخطأ الذي تريده ، على سبيل المثال:

location /images {
    try_files $uri =403;
}

سيُظهر هذا خطأً ممنوعًا في حالة عدم وجود الصورة ، أو إذا استخدمت 500 ، فسيظهر خطأ في الخادم ، إلخ.

170
Mohammad AbuShady