Score:1

Nginx - การเปลี่ยนโฟลเดอร์รูทสำหรับ url เฉพาะทำให้เกิดข้อผิดพลาด 404

ธง us

ฉันกำลังพยายามจัดบล็อกตำแหน่งสำหรับทุกคนที่ผ่านไปมา mydomain.com/game/admin url ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ nginx ดึงเนื้อหาที่มีอยู่ /var/www/html/my-cakephp-app/ ไดเรกทอรี แอปพลิเคชันของฉันสร้างขึ้นโดยใช้ cakephp framework และโครงสร้างไดเร็กทอรีแสดงอยู่ด้านล่าง:

  • /var/www/html/my-cakephp-app/
    • ผู้ดูแลระบบ
      • กำหนดค่า
      • คอนโซล
      • ผู้ควบคุม
      • ดู
      • webroot (ไฟล์ index.php จุดเข้าใช้งานของแอพมีอยู่ในไดเร็กทอรีนี้)

นอกจากนี้ฉันยังมีเว็บไซต์ html/css แบบคงที่ซึ่งอยู่ในไฟล์ /var/www/html ไดเรกทอรี ดังนั้นใครก็ตามที่มี มายโดเมน.คอม url ก็เห็นเว็บนั้นด้วย

นี่คือบล็อกเซิร์ฟเวอร์ nginx ปัจจุบันของฉัน:

เซิร์ฟเวอร์ {
    ฟัง 80;
    ฟัง [::]:80;

    รูท /var/www/html;

    ดัชนี index.html index.htm index.php;

    server_name mydomain.com;

    ที่ตั้ง / {
        try_files $uri $uri/ =404;
    }
    
    ตำแหน่ง /เกม/ผู้ดูแลระบบ {
            ส่งคืน 301 /game/admin/;
    }

    ตำแหน่ง /game/admin/ {

                รูท /var/www/html/my-cakephp-app/admin/webroot;
                try_files $uri $uri/ /game/admin/index.php$is_args$args;
  
                ตำแหน่ง ~* \.php(/|$) {
                  รวมตัวอย่าง/fastcgi-php.conf;
                  fastcgi_pass ยูนิกซ์:/var/run/php/php7.4-fpm.sock;
                  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
               } 

    }

    ตำแหน่ง ~ \.php$ {
        รวมตัวอย่าง/fastcgi-php.conf;
        fastcgi_pass ยูนิกซ์:/var/run/php/php7.4-fpm.sock;
    }

    ตำแหน่ง ~ /\.ht {
        ปฏิเสธทั้งหมด
    }
}

ด้วยการตั้งค่านี้ เว็บไซต์แบบคงที่ของฉันทำงานได้ดี แต่แอปพลิเคชัน cakephp ให้ข้อผิดพลาด 404 ไม่พบในเบราว์เซอร์ ไม่มีข้อผิดพลาดใดๆ ใน nginx/error.log

แต่เมื่อฉันเรียกใช้ด้วยการกำหนดค่า nginx ที่ต่ำกว่า แอปพลิเคชันของฉันก็ทำงานได้ดี แต่ฉันต้องกำจัดไซต์ html/css ของฉัน ฉันกำลังวางแผนที่จะอัปเกรดแอป html/css ด้วยไซต์ wordpress ดังนั้นฉันจึงควรมีความสามารถในการเรียกใช้ไซต์เวิร์ดเพรสในฐานะพาเรนต์

เซิร์ฟเวอร์ {
    ฟัง 80;
    server_name mydomain.com;
    รูท /var/www/html/my-cakephp-app/admin/webroot;
    
    ดัชนี index.html index.htm index.php;
 
    ที่ตั้ง / {
        try_files $uri $uri/ /index.php$is_args$args;
        เปิดดัชนีอัตโนมัติ;
    }
    
    ตำแหน่ง ~ \.php$ {
        รวมตัวอย่าง/fastcgi-php.conf;
        fastcgi_pass ยูนิกซ์:/run/php/php7.0-fpm.sock;
    }
    
    ตำแหน่ง ~ /\.ht {
        ปฏิเสธทั้งหมด
    }
}

ฉันนึกไม่ออกว่าฉันทำอะไรผิดกับการบล็อกเซิร์ฟเวอร์ครั้งแรก ข้อเสนอแนะใด ๆ จะเป็นประโยชน์จริงๆ

Score:1
ธง jp

ปัญหาหลักสองประการคือ:

  • ด้านนอก ตำแหน่ง ~ \.php$ บล็อกมีความสำคัญเหนือ ตำแหน่ง /เกม/admin/ บล็อกเว้นแต่คุณจะใช้ ^~ ตัวแก้ไข (ดู เอกสารนี้ เพื่อดูรายละเอียด)
  • เดอะ ราก คำสั่งสร้างพาธไปยังไฟล์โดยการต่อข้อมูลอย่างง่าย ดังนั้นคอนโทรลเลอร์ของคุณจึงคาดว่าจะอยู่ที่ /var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php (ดู เอกสารนี้ เพื่อดูรายละเอียด)

ทางเลือกหนึ่งคือการย้ายโครงการเพื่อให้โครงสร้างไดเร็กทอรีตรงกับโครงสร้าง URI สิ่งนี้สามารถทำได้โดยใช้ลิงก์สัญลักษณ์ที่ชี้ /var/www/html/game/admin ถึง /var/www/html/my-cakephp-app/admin/webroot ซึ่งในกรณีภายนอก ตำแหน่ง ~ \.php$ บล็อกจะสามารถดำเนินการทั้งสองโครงการ


อีกทางเลือกหนึ่งคือ นามแฝง คำสั่ง ดู เอกสารนี้ สำหรับรายละเอียด

ตำแหน่ง ^~ /game/admin {
    นามแฝง /var/www/html/my-cakephp-app/admin/webroot;

    ถ้า (!-e $request_filename) { เขียนใหม่ ^ /game/admin/index.php สุดท้าย; }

    ตำแหน่ง ~ \.php$ {
        ถ้า (!-f $request_filename) { ส่งคืน 404; }

        รวมตัวอย่าง/fastcgi-php.conf;
        fastcgi_pass ยูนิกซ์:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

โปรดทราบว่า $document_root$fastcgi_script_name จะไม่ทำงานกับ นามแฝง และนั่น $request_filename ควรใช้แทน

ฉันหลีกเลี่ยงการใช้ นามแฝง และ try_files กันเนื่องจาก ปัญหานี้. ดู ข้อควรระวังนี้ เกี่ยวกับการใช้ ถ้า คำสั่ง

Madushan Perera avatar
us flag
โซลูชันของคุณทำงานได้ดีอย่างสมบูรณ์ ฉันเสียเวลากับคำสั่งรูททั้งวัน อย่างไรก็ตาม ขอบคุณมากสำหรับคำอธิบายที่ดี

โพสต์คำตอบ

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