เมื่อฉันไปที่ URL ที่ไม่มีอยู่จริงที่มีนามสกุล .php ฉันได้รับหน้าแสดงข้อผิดพลาด ngnix 404 อย่างไรก็ตาม url ที่ไม่มีนามสกุล .php จะทำงานตามที่คาดไว้โดยใช้ไฟล์ try_files โดยที่ 404 ถูกจัดการผ่านแอปพลิเคชัน php
มันเกิดขึ้นตั้งแต่ฉันเพิ่มรหัสนี้เป็น แนะนำ
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
ถ้า (!-f $document_root$fastcgi_script_name) {
กลับ 404;
}
เหตุผลในการเพิ่มสิ่งนี้คือเพื่อแก้ไขข้อผิดพลาดในบันทึก: ส่ง FastCGI ใน stderr: "ไม่ทราบสคริปต์หลัก" ขณะอ่านส่วนหัวการตอบสนองจากอัปสตรีม
ข้อผิดพลาดนี้เกิดขึ้นเมื่อฉันไปที่ไฟล์ non-existent.php ฉันอ่านโพสต์จำนวนมากเกี่ยวกับปัญหาเกี่ยวกับ 'SCRIPT_FILENAME' ที่หายไป แต่นี่ไม่ใช่กรณีของฉัน
ตัวอย่าง.conf
เซิร์ฟเวอร์ {
ฟัง 443 ssl;
ฟัง [::]:443 ssl;
server_name example.com;
รูท /var/www/example/public/public;
access_log /var/log/nginx/example.access.log main_ext;
error_log /var/log/nginx/example.error.log เตือน;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
รวม /etc/nginx/include.d/ssl.conf;
#ลาราเวล
เขียนใหม่ ^/index.php/(.*) /$1 ถาวร;
ที่ตั้ง = / {
try_files /page-cache/pc__index__pc.html /index.php?$query_string;
}
ที่ตั้ง / {
try_files $uri $uri/ /page-cache/$uri.html /index.php?$query_string;
}
ตำแหน่ง ~ [^/]\.php(/|$) {
รวม /etc/nginx/include.d/php.conf;
fastcgi_pass ยูนิกซ์:/var/run/php/php8.0-fpm-example.sock;
}
}
php.conf
# ตรวจสอบไฟล์ที่มีอยู่
try_files $uri =404;
# https://www.nginx.com/nginx-wiki/build/dirhtml/start/topics/examples/phpfcgi/
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
ถ้า (!-f $document_root$fastcgi_script_name) {
กลับ 404;
}
fastcgi_index index.php;
# ลดช่องโหว่ https://httpoxy.org/
fastcgi_param HTTP_PROXY "";
ปิด fastcgi_intercept_errors;
# รวมการตั้งค่า fastcgi_param
รวม fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
ตัวอย่าง URL:
https://example.com/foo - ใช้งานได้ดี แสดง 404 ภายในแอพ php
https://example.com/foo.php - แสดงค่าเริ่มต้น ngnix 404