Score:2

NGINX บล็อกการเข้าถึงตำแหน่งและเปลี่ยนเส้นทางไปยังหน้าข้อผิดพลาดที่กำหนดเอง

ธง cn

ฉันมีปัญหากับการตั้งค่า NGINX ด้วยการเปลี่ยนเส้นทางไปยังหน้าแสดงข้อผิดพลาดที่กำหนดเองในตำแหน่งอื่น (รวมถึง css, รูปภาพ, js) หากหน้าแสดงข้อผิดพลาดถูกโยนทิ้ง

ตอนแรกฉันต้องการบล็อกการเข้าถึงโฟลเดอร์ (เช่น .git). สามารถทำได้ง่ายผ่าน (ภายในบล็อกเซิร์ฟเวอร์)

ตำแหน่ง ~ /(.git) {
    ปฏิเสธทั้งหมด
    กลับ 404;
}

จากนั้นฉันสร้างองค์ประกอบ error_page ที่กำหนดเอง (ภายในบล็อกเซิร์ฟเวอร์) ด้วยไฟล์ 404.html ที่กำหนดเองในตำแหน่งอื่นที่ไม่ใช่ไดเรกทอรีรากของเว็บไซต์

error_page 404 /404.html;
สถานที่ = /404.html {
    รูท /var/data/websites/error-page;
    ภายใน;
}

หลังจากการเปลี่ยนแปลงเหล่านี้ หน้า 404 ที่กำหนดเองของฉันจะแสดงขึ้น แต่ไม่มี css, js และรูปภาพ

ถ้าฉันตรวจสอบเว็บไซต์ เหตุผลก็ง่าย: เส้นทางของไฟล์ไม่ถูกต้อง - พวกเขาอิงตามตำแหน่ง (ในตัวอย่างของฉัน .git). https://it.dmetzler1988.io/.git/css/main.css net::ERR_ABORTED 404.

นี่คือไฟล์กำหนดค่า NGINX ที่สมบูรณ์สำหรับหน้านี้ (ลบเฉพาะเส้นทางใบรับรอง ssl เท่านั้น):

เซิร์ฟเวอร์ {
    ฟัง 443 ssl;
    ฟัง [::]:443 ssl http2;

    ssl_certificate <เส้นทาง>;
    ssl_certificate_key <เส้นทาง>;

    server_name it.dmetzler1988.io;
    รูท /var/data/websites/dmetzler1988.io/it.dmetzler1988.io;
    ดัชนี index.html index.php;

    error_page 404 /404.html;
    สถานที่ = /404.html {
        รูท /var/data/websites/error-page;
        ภายใน;
    }

    ตำแหน่ง ~ /(.git) {
        ปฏิเสธทั้งหมด
        กลับ 404;
    }
}

ดังนั้นคำถามของฉันเกี่ยวกับสถานที่นี้:

  1. ฉันจะแก้ไขปัญหาด้วยเส้นทางที่ไม่ถูกต้องได้อย่างไร (ลบไฟล์ .git จากเส้นทาง)?
  2. นี่เป็นวิธีที่ถูกต้องสำหรับกรณีการใช้งานดังกล่าวหรือมีวิธีแก้ไขที่ดีกว่านี้หรือไม่
sv flag
ยินดีต้อนรับสู่ ServerFault วิธีที่ดีที่สุดคือเก็บเนื้อหา (main.css, main.js ฯลฯ) ไว้ในโฟลเดอร์แยกต่างหาก (เช่น ใน /example-folder/) แล้วใช้บล็อกตำแหน่งเพิ่มเติม (`ตำแหน่ง /example-folder/ { alias "/ path/to/example-folder"; }`) ด้วยรูทหรือนามแฝงที่กำหนดเองเพื่อให้บริการไฟล์เหล่านั้น
Ivan Shatsky avatar
gr flag
@PothiKalimuthu โซลูชันของคุณต้องการคำสั่ง `alias /path/to/example-folder/` เพื่อให้ทำงานได้อย่างถูกต้อง (สังเกตเครื่องหมายทับท้าย)หากไม่มีคำขอเช่น `/example-folder/css/main.css` จะทำหน้าที่เป็น `/path/to/example-foldercss/main.css` ซึ่งทำให้คุณเห็นข้อผิดพลาด `HTTP 404 Not Found` อย่างชัดเจน ฉันอธิบายพฤติกรรม "นามแฝง" นี้ [ที่นี่](https://stackoverflow.com/a/69296739/7121513)
devKyrios avatar
cn flag
@IvanShatsky ฉันลองมากกว่าที่คุณอธิบายไว้ (ลองแก้ไขหลายอย่างด้วย) แต่มันใช้ไม่ได้กับ css ของฉัน (ใช้เฉพาะเส้นทาง css สำหรับการทดสอบ) `ตำแหน่ง ~* /.git/css/.* { ราก /var/data/websites/error-page/css; }`. มีอะไรผิดปกติหรือไม่? ฉันได้รับข้อผิดพลาด 404 สำหรับไฟล์นี้ด้วยหลังจากเพิ่มตำแหน่งใหม่
Ivan Shatsky avatar
gr flag
@devKyrios คุณสามารถเพิ่มการกำหนดค่าที่คุณพยายามอัปเดตสำหรับคำถามของคุณได้หรือไม่
devKyrios avatar
cn flag
@IvanShatsky ฮ่าฮ่า ขออภัย แก้ไขได้ช้า ตอนนี้กำลังเพิ่ม ฉันลองโดยมีและไม่มี `/.*` ในตอนท้าย นอกจากนี้ยังมีตำแหน่งที่ละเอียดอ่อนและอื่น ๆ
devKyrios avatar
cn flag
@IvanShatsky โอ้ แย่จัง.. ขอโทษ ไม่เป็นไร ฉันล้มเหลว ใช้ไม่ได้กับบล็อกตำแหน่งที่ฉันเพิ่มเมื่อวาน ( `location ~ /\.git { return 404; }` ) ฉันมีบล็อกตำแหน่งที่ทับซ้อนกัน เสียใจ.
Score:0
ธง gr

ประการแรก เกี่ยวกับข้อผิดพลาดในการกำหนดค่าของคุณ

ตำแหน่ง ~ /(.git) { ... }

ดูเหมือนว่าคุณไม่ค่อยคุ้นเคยกับรูปแบบ PCRE regex ไม่จำเป็นต้องใช้แคปเจอร์กรุ๊ปที่นี่ - แคปเจอร์กรุ๊ปจะใช้เมื่อคุณต้องการเนื้อหาในภายหลัง อย่างไรก็ตาม ไม่ใช่ข้อผิดพลาดร้ายแรง ส่วนที่แย่ที่สุดคือคุณใช้ dot char ที่ไม่มีการป้องกันซึ่งทำงานเป็นไวด์การ์ดในรูปแบบ regex วิธีนี้ทำให้คุณบล็อก URI ที่มีสตริงที่มีอักขระตัวที่สอง สาม และสี่ได้อย่างมีประสิทธิภาพ คอมไพล์ (เช่น. /agitation/index.html, /any/prefix/agitation/index.htmlเป็นต้น) รูปแบบ regex ที่ถูกต้องในที่นี้จะเป็น /\.git (ปิดกั้นสิ่งที่ขึ้นต้นด้วย .git รวมทั้ง .gitignoreฯลฯ ในระดับไดเร็กทอรีที่ซ้อนกัน)

ต่อไป คุณกำลังใช้สองคำสั่งในตำแหน่งนั้น - ปฏิเสธทั้งหมด และ กลับ 404. มีเพียงหนึ่งเดียวเท่านั้นที่จะเพียงพอที่นี่ - เช่นกัน ปฏิเสธทั้งหมด (กลับมา HTTP 403 ถูกห้าม) หรือ กลับ 404 (กลับมา ไม่พบ HTTP 404). เหตุผลที่คุณได้รับ 404 มากกว่า 403 ก็คือ กลับ คำสั่งดำเนินการที่ เขียนซ้ำ ขอขั้นตอนการประมวลผลในขณะที่ ปฏิเสธ คนหนึ่งถูกประหารชีวิตในภายหลัง เข้าไป เฟส (ขั้นตอนการประมวลผลคำขอที่อธิบายไว้ใน คู่มือการพัฒนา).

ตอนนี้กลับไปที่คำถามของคุณ ดูเหมือนว่าคุณกำลังอ้างอิงเนื้อหาของคุณโดยใช้เส้นทาง URI สัมพัทธ์ เช่น

<link rel="stylesheet" type="text/css" href="css/main.css">

ตัวเลือกบางอย่างของคุณคือ (แต่ไม่จำกัดเพียง):

  • ฝังเนื้อหาทั้งหมดลงใน HTML ตัวจัดการข้อผิดพลาด (รวมถึงรูปภาพของคุณ คุณสามารถเข้ารหัสรูปภาพของคุณเป็น BASE64 และใช้ URI ข้อมูล);

  • ย้ายเนื้อหาทั้งหมดไปยังบางโฟลเดอร์ภายใต้ webroot ของเว็บไซต์หลักของคุณ (เช่น /var/data/websites/dmetzler1988.io/it.dmetzler1988.io/assets/errors และอ้างอิงโดยใช้เส้นทางแบบเต็ม:

    <link rel="stylesheet" type="text/css" href="/assets/errors/css/main.css">
    
devKyrios avatar
cn flag
ในตอนแรก ขอบคุณมากสำหรับความคิดเห็นที่เป็นประโยชน์ของคุณ! ความรู้ของฉันเกี่ยวกับ regex ใน NGINX ดูเหมือนจะผิด นอกจากนี้ ข้อมูลคำสั่งยังมีประโยชน์มาก ดังนั้นฉันจึงปลอดภัยด้วยคำสั่ง `return 404` เท่านั้น แนวคิดทั้งสองของคุณในการแก้ปัญหาแหล่งที่มาจะเป็นวิธีแก้ปัญหา แต่ฉันไม่ต้องการทำซ้ำโค้ดและจะทำให้แก้ไข/เข้าใจได้ง่าย (โดยไม่ต้องใช้การเข้ารหัส base64 และ css/js ใน html) ฉันหวังว่าจะมีวิธีแก้ไขด้วยการแก้ไขรูท พร็อกซีหรือที่คล้ายกัน ขอขอบคุณอีกครั้งสำหรับการตอบรับที่สร้างสรรค์และเป็นประโยชน์ของคุณ!!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา