Score:0

บล็อกตำแหน่ง NGINX ไปป์ทุกอย่างไปที่ index.php ยกเว้นรูปภาพ

ธง cn

ฉันมีเซิร์ฟเวอร์ 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 รวมถึงนามสกุลไฟล์รูปภาพได้อย่างไร

Richard Smith avatar
jp flag
การกำหนดค่าเสร็จสมบูรณ์หรือไม่ อะไรอยู่ใน `/etc/nginx/conf/include_template.conf`? มันทำงานเหมือนคุณมี `ตำแหน่ง' ที่ตรงกับ URI ที่ลงท้ายด้วย `.jpg`
andrewniesen avatar
cn flag
@RichardSmith - เป็นคำถามที่ดี ฉันเพิ่มการกำหนดค่าเพิ่มเติมด้านบน ฉันอ่านมันแล้วและไม่เห็นอะไรที่จะทำให้มันเป็นแบบนี้ - แม้ว่าฉันจะต่อสู้กับ NGINX เสมอ
Richard Smith avatar
jp flag
ดูเหมือนว่า `/etc/nginx/conf/browsercache.conf` ตรงกับ URL นั้น รูปแบบ `jpe?g` ตรงกับ `jpg`
andrewniesen avatar
cn flag
นั่นจะแก้ไขได้เมื่อฉันแสดงความคิดเห็นตำแหน่งใน `/etc/nginx/conf/browsercache.conf` แต่เหตุใดการแคชจึงส่งผลต่อสิ่งนี้
Richard Smith avatar
jp flag
ไม่มีส่วนเกี่ยวข้องกับการแคช แต่ [วิธีที่ Nginx เลือกบล็อก `สถานที่' เพื่อดำเนินการตามคำขอ] (http://nginx.org/en/docs/http/request_processing.html)

โพสต์คำตอบ

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