Am un server API care direcționează întregul trafic către un script index.php care utilizează PHP $_SERVER['REQUEST_URI']
variabilă pentru a interpreta adresa URL și a furniza răspunsul corect.
Acest lucru funcționează perfect pentru orice, CU EXCEPȚIA că am un script care servește temporar fișiere de la un punct final neautentificat pentru consumul public. Deci browserul interpretează corect datele fișierului, extensia fișierului este inclusă la sfârșitul adresei URL.
Două exemple:
Exemplul 1
https://myapi.com/file/read/0e3970ea32b2cce0285564aeadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.
Această solicitare este transmisă către $rădăcină_server/index.php
, scriptul PHP extrage datele fișierului din S3 și transmite datele binare cu anteturile corecte de tip mime. Browserul inițiază o descărcare și totul funcționează excelent. (Acest lucru funcționează bine și cu fișierele .doc și .pdf)
Exemplul 2
https://myapi.com/file/read/0e3970ea32b2cce0285564aeadb36c9d/m7hwCjCKDju88mKbW29EBhxoiuWTz9SF/Q2290814_BDKC3_031122_165240.jpg
Acest fișier JPEG nu va servi corect, ci mai degrabă este afișată o pagină 404 generată de NGINX. După câteva teste, am stabilit că NGINX nu transmite cererea către $rădăcină_server/index.php
Configurarea NGINX
Configurare principală
Server {
asculta 80;
nume_server myapi.com;
set_real_ip_de la 0.0.0.0/0;
real_ip_header CF-Conectare-IP;
index index.php index.html index.htm;
access_log /var/log/nginx/myapi.com_access.log;
error_log /var/log/nginx/myapi.com_error.log;
root /var/www/vhosts/myapi.com/public;
client_max_body_size 25m;
include /etc/nginx/conf/include_template.conf;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload";
add_header X-Content-Type-Options „nosniff” întotdeauna;
add_header X-Frame-Options „SAMEORIGIN” întotdeauna;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy „no-referrer”;
Locație / {
try_files $uri $uri/ /index.php?$query_string;
}
locație ~ .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 „activat”;
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;
include fastcgi_params;
}
}
/etc/nginx/conf/include_template.conf
includ /etc/nginx/conf/gzip.conf;
includ /etc/nginx/conf/restrictions.conf;
includ /etc/nginx/conf/cors.conf;
includ /etc/nginx/conf/browsercache.conf;
/etc/nginx/conf/gzip.conf
# Activați compresia Gzip.
gzip on;
# Dezactivează Gzip pe IE6.
gzip_disable „msie6”;
# Permiteți proxy-urilor să memoreze în cache atât versiunea comprimată, cât și versiunea obișnuită a fișierului.
# Evită clienții care nu acceptă Gzip, scoaterea de farfurii.
gzip_vary on;
# Comprimați datele, chiar și atunci când clientul se conectează printr-un proxy.
gzip_proxied orice;
# Nivelul de compresie de aplicat fișierelor. Un nivel de compresie mai mare crește
# Utilizarea procesorului. Nivelul 5 este un mediu fericit care are ca rezultat o compresie de aproximativ 75%.
gzip_comp_level 5;
# Versiunea HTTP minimă a unei cereri de comprimare.
gzip_http_versiunea 1.1;
# Nu comprimați fișierele mai mici de 256 de octeți, deoarece reducerea dimensiunii va fi neglijabilă.
gzip_min_length 256;
# Comprimați următoarele tipuri MIME.
gzip_types
aplicație/atom+xml
aplicație/javascript
aplicație/json
aplicație/ld+json
aplicație/manifest+json
aplicație/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
aplicație/xml
font/opentype
imagine/bmp
imagine/svg+xml
imagine/pictogramă x
text/cache-manifest
text/css
text/ simplu
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/componenta x
text/politica-x-cross-domain-policy;
# text/html este întotdeauna comprimat când este activat.
/etc/nginx/conf/restrictions.conf
locație /.git { deny all; }
locație /.htaccess { deny all; }
locație /.htpasswd { deny all; }
locație /.user.ini { deny all; }
locație ~ ^/\. { nega tot; }
locație ~ ~$ { deny all; }
locație ~* \.sql { deny all; }
locație ~* config\.json { deny all; }
#dacă ($request_method !~ ^(GET|HEAD|POST)$ )
#if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ )
#{
# return 405;
#}
/etc/nginx/conf/cors.conf
locație ~* \.(?:svgz?|ttf|ttc|otf|eot|woff|woff2)$ {
add_header Acces-Control-Permite-Origine „*”;
expiră 8d;
}
/etc/nginx/conf/browsercache.conf
locație ~* \.(?: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)$ {
expiră 7d;
}
Întrebare
Cum îmi pot modifica configurația pentru ca fiecare solicitare să fie transmisă către index.php, inclusiv extensiile de fișiere imagine?