ฉันมีเซิร์ฟเวอร์ API ที่ไพพ์ทราฟฟิกทั้งหมดไปยังสคริปต์ index.php ที่ใช้ PHP $_SERVER['REQUEST_URI']
ตัวแปรเพื่อตีความ URL และตอบสนองที่ถูกต้อง
สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับทุกสิ่ง ยกเว้นฉันมีสคริปต์ที่ให้บริการไฟล์ชั่วคราวจากจุดสิ้นสุดที่ไม่ผ่านการรับรองความถูกต้องสำหรับการใช้งานสาธารณะ ดังนั้นเบราว์เซอร์จึงตีความข้อมูลไฟล์ได้อย่างถูกต้อง นามสกุลไฟล์จะรวมอยู่ที่ส่วนท้ายของ URL
สองตัวอย่าง:
ตัวอย่างที่ 1
https://myapi.com/file/read/0e3970ea32b2cce0285564aeadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.xlsx
คำขอนี้ส่งไปยัง $server_root/index.php
สคริปต์ PHP จะดึงข้อมูลไฟล์จาก S3 และสตรีมข้อมูลไบนารีด้วยส่วนหัวประเภท mime ที่ถูกต้อง เบราว์เซอร์เริ่มต้นการดาวน์โหลดและทุกอย่างทำงานได้ดี (ใช้งานได้ดีกับไฟล์ .doc และ .pdf ด้วย)
ตัวอย่างที่ 2
https://myapi.com/file/read/0e3970ea32b2cce0285564aeadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.jpg
ไฟล์ JPEG นี้จะแสดงผลไม่ถูกต้อง แต่จะแสดงหน้า 404 ที่สร้างโดย NGINX หลังจากการทดสอบ ฉันพบว่า NGINX ไม่ได้ส่งคำขอไปยัง $server_root/index.php
การกำหนดค่า NGINX
การกำหนดค่าหลัก
เซิร์ฟเวอร์ {
ฟัง 80;
server_name myapi.com;
set_real_ip_ จาก 0.0.0.0/0;
real_ip_header CF-Connecting-IP;
ดัชนี index.php index.html index.htm;
access_log /var/log/nginx/myapi.com_access.log;
error_log /var/log/nginx/myapi.com_error.log;
รูท /var/www/vhosts/myapi.com/public;
client_max_body_size 25m;
รวม /etc/nginx/conf/include_template.conf;
add_header การขนส่งที่เข้มงวด - ความปลอดภัย "อายุสูงสุด = 15768000; includeSubDomains; โหลดล่วงหน้า";
add_header X-Content-Type-Options "nosniff" เสมอ;
add_header X-Frame-Options "SAMEORIGIN" เสมอ
add_header X-XSS-การป้องกัน "1; mode=block";
add_header นโยบายผู้อ้างอิง "ไม่มีผู้อ้างอิง";
ที่ตั้ง / {
try_files $uri $uri/ /index.php?$query_string;
}
ตำแหน่ง ~ .php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param HTTPS 'เปิด';
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_read_timeout 1800;
fastcgi_connect_timeout 1800;
fastcgi_send_timeout 1800;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
send_timeout 1800;
รวม fastcgi_params;
}
}
/etc/nginx/conf/include_template.conf
รวม /etc/nginx/conf/gzip.conf;
รวม /etc/nginx/conf/restrictions.conf;
รวม /etc/nginx/conf/cors.conf;
รวม /etc/nginx/conf/browsercache.conf;
/etc/nginx/conf/gzip.conf
# เปิดใช้งานการบีบอัด Gzip
เปิด gzip;
# ปิดการใช้งาน Gzip บน IE6
gzip_disable "msie6";
# อนุญาตให้ผู้รับมอบฉันทะแคชทั้งไฟล์บีบอัดและเวอร์ชันปกติ
# หลีกเลี่ยงไคลเอนต์ที่ไม่สนับสนุน Gzip ที่แสดงซึ่งพูดพล่อยๆ
gzip_vary บน;
# บีบอัดข้อมูล แม้ว่าไคลเอนต์จะเชื่อมต่อผ่านพร็อกซี
gzip_proxyed ใด ๆ ;
# ระดับการบีบอัดที่จะใช้กับไฟล์ ระดับการบีบอัดที่สูงขึ้นจะเพิ่มขึ้น
#การใช้งานซีพียู ระดับ 5 เป็นสื่อที่มีความสุขส่งผลให้มีการบีบอัดประมาณ 75%
gzip_comp_level 5;
# เวอร์ชัน HTTP ขั้นต่ำของคำขอเพื่อดำเนินการบีบอัด
gzip_http_version 1.1;
# อย่าบีบอัดไฟล์ที่มีขนาดเล็กกว่า 256 ไบต์ เนื่องจากการลดขนาดจะไม่สำคัญ
gzip_min_length 256;
# บีบอัดประเภท MIME ต่อไปนี้
gzip_types
แอปพลิเคชัน/atom+xml
แอปพลิเคชัน/จาวาสคริปต์
แอปพลิเคชัน/json
แอปพลิเคชัน/ld+json
แอปพลิเคชัน/รายการ +json
แอปพลิเคชัน/rss+xml
แอปพลิเคชัน/vnd.geo+json
แอปพลิเคชัน/vnd.ms-fontobject
แอปพลิเคชัน/x-font-ttf
แอปพลิเคชัน/x-web-app-manifest+json
แอปพลิเคชัน/xhtml+xml
แอปพลิเคชัน/xml
แบบอักษร/opentype
ภาพ/bmp
รูปภาพ/svg+xml
รูปภาพ/x-icon
ข้อความ/รายการแคช
ข้อความ/css
ข้อความ/ธรรมดา
ข้อความ/วีการ์ด
ข้อความ/vnd.rim.location.xloc
ข้อความ/vtt
ข้อความ/x-คอมโพเนนต์
ข้อความ/x-cross-domain-policy;
# text/html จะถูกบีบอัดเสมอเมื่อเปิดใช้งาน
/etc/nginx/conf/restrictions.conf
สถานที่ /.git { ปฏิเสธทั้งหมด; }
ตำแหน่ง /.htaccess { ปฏิเสธทั้งหมด; }
ตำแหน่ง /.htpasswd { ปฏิเสธทั้งหมด; }
ตำแหน่ง /.user.ini { ปฏิเสธทั้งหมด; }
ที่ตั้ง ~ ^/\ { ปฏิเสธทั้งหมด; }
ตำแหน่ง ~ ~$ { ปฏิเสธทั้งหมด; }
ตำแหน่ง ~* \.sql { ปฏิเสธทั้งหมด; }
ตำแหน่ง ~* config\.json { ปฏิเสธทั้งหมด; }
#if ($request_method !~ ^(GET|HEAD|POST)$ )
#if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ )
#{
# กลับ 405;
#}
/etc/nginx/conf/cors.conf
ตำแหน่ง ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
add_header Access-Control-Allow-Origin "*";
หมดอายุ 8d;
}
/etc/nginx/conf/browsercache.conf
ตำแหน่ง ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg |midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
หมดอายุ 7d;
}
คำถาม
ฉันจะแก้ไขการกำหนดค่าเพื่อให้ทุกคำขอส่งไปยัง index.php รวมถึงนามสกุลไฟล์รูปภาพได้อย่างไร