Tôi có một máy chủ API chuyển tất cả lưu lượng truy cập tới tập lệnh index.php sử dụng PHP $_SERVER['REQUEST_URI']
biến để diễn giải URL và cung cấp phản hồi chính xác.
Điều này hoạt động hoàn hảo cho mọi thứ, NGOẠI TRỪ tôi có một tập lệnh tạm thời phục vụ các tệp từ một điểm cuối không được xác thực cho mục đích sử dụng chung. Vì vậy, trình duyệt diễn giải chính xác dữ liệu tệp, phần mở rộng tệp được bao gồm ở cuối URL.
Hai ví dụ:
ví dụ 1
https://myapi.com/file/read/0e3970ea32b2cce0285564aadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.xlsx
Yêu cầu này được chuyển đến $server_root/index.php
, tập lệnh PHP lấy dữ liệu tệp từ S3 và truyền dữ liệu nhị phân với tiêu đề loại mime chính xác. Trình duyệt bắt đầu tải xuống và mọi thứ đều hoạt động tốt. (Điều này cũng hoạt động tốt với các tệp .doc và .pdf)
ví dụ 2
https://myapi.com/file/read/0e3970ea32b2cce0285564aadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.jpg
Tệp JPEG này sẽ không phân phối chính xác mà thay vào đó, một trang 404 do NGINX tạo được hiển thị. Sau một số thử nghiệm, tôi đã xác định rằng NGINX không chuyển yêu cầu tới $server_root/index.php
Cấu hình NGINX
Cấu hình chính
người phục vụ {
nghe 80;
server_name myapi.com;
set_real_ip_từ 0.0.0.0/0;
real_ip_header CF-Connecting-IP;
chỉ mục index.php index.html index.htm;
access_log /var/log/nginx/myapi.com_access.log;
error_log /var/log/nginx/myapi.com_error.log;
gốc /var/www/vhosts/myapi.com/public;
client_max_body_size 25m;
bao gồm /etc/nginx/conf/include_template.conf;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
add_header X-Content-Type-Options "nosniff" luôn;
add_header X-Frame-Options luôn luôn "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header Chính sách người giới thiệu "không có người giới thiệu";
địa điểm / {
try_files $uri $uri/ /index.php?$query_string;
}
vị trí ~ .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 'bật';
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;
gửi_thời gian chờ 1800;
bao gồm fastcgi_params;
}
}
/etc/nginx/conf/include_template.conf
bao gồm /etc/nginx/conf/gzip.conf;
bao gồm /etc/nginx/conf/restrictions.conf;
bao gồm /etc/nginx/conf/cors.conf;
bao gồm /etc/nginx/conf/browsercache.conf;
/etc/nginx/conf/gzip.conf
# Kích hoạt tính năng nén Gzip.
bật gzip;
# Tắt Gzip trên IE6.
gzip_disable "msie6";
# Cho phép proxy lưu vào bộ đệm cả phiên bản nén và phiên bản thông thường của tệp.
# Tránh các ứng dụng khách không hỗ trợ xuất ra Gzip một cách vô nghĩa.
bật gzip_vary;
# Nén dữ liệu, ngay cả khi máy khách kết nối qua proxy.
gzip_proxied bất kỳ;
# Mức độ nén để áp dụng cho các tập tin. Mức nén cao hơn tăng
# sử dụng CPU. Mức 5 là một phương tiện hạnh phúc dẫn đến khả năng nén khoảng 75%.
gzip_comp_level 5;
# Phiên bản HTTP tối thiểu của yêu cầu thực hiện nén.
gzip_http_version 1.1;
# Không nén các tệp nhỏ hơn 256 byte vì việc giảm kích thước sẽ không đáng kể.
gzip_min_length 256;
# Nén các loại MIME sau.
gzip_types
ứng dụng/nguyên tử+xml
ứng dụng/javascript
ứng dụng/json
ứng dụng/ld+json
ứng dụng/tệp kê khai + json
ứng dụng/rss+xml
ứng dụng/vnd.geo+json
ứng dụng/vnd.ms-fontobject
ứng dụng/x-phông chữ-ttf
ứng dụng/x-web-app-manifest+json
ứng dụng/xhtml+xml
ứng dụng/xml
phông chữ/kiểu mở
hình ảnh/bmp
hình ảnh/svg+xml
hình ảnh/biểu tượng x
văn bản/bộ đệm-tệp kê khai
văn bản/css
văn bản/đồng bằng
văn bản/vcard
text/vnd.rim.location.xloc
văn bản/vtt
văn bản/thành phần x
văn bản/x-chính sách tên miền chéo;
# text/html luôn được nén khi được bật.
/etc/nginx/conf/restrictions.conf
vị trí /.git { từ chối tất cả; }
vị trí /.htaccess { từ chối tất cả; }
vị trí /.htpasswd { từ chối tất cả; }
vị trí /.user.ini { từ chối tất cả; }
vị trí ~ ^/\. { Phủ nhận tất cả; }
vị trí ~ ~$ { từ chối tất cả; }
vị trí ~* \.sql { từ chối tất cả; }
vị trí ~* config\.json { từ chối tất cả; }
#if ($request_method !~ ^(GET|HEAD|POST)$ )
#if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ )
#{
# trả về 405;
#}
/etc/nginx/conf/cors.conf
vị trí ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
add_header Access-Control-Allow-Origin "*";
hết hạn 8d;
}
/etc/nginx/conf/browsercache.conf
vị trí ~* \.(?: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)$ {
hết hạn 7d;
}
Câu hỏi
Làm cách nào tôi có thể sửa đổi cấu hình của mình để mọi yêu cầu được chuyển đến index.php, bao gồm cả phần mở rộng tệp hình ảnh?