Puncte:0

Blocul de locație NGINX trimite totul către index.php, cu excepția imaginilor

drapel cn

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?

Richard Smith avatar
drapel jp
Este configurația completă? Ce este în `/etc/nginx/conf/include_template.conf`? Se comportă ca și cum ai avea o „locație” care se potrivește cu URI care se termină cu „.jpg”.
andrewniesen avatar
drapel cn
@RichardSmith - întrebare bună. Am adăugat configurații suplimentare mai sus. L-am citit și nu văd nimic care să-l determine să se comporte așa - deși mă lupt mereu cu NGINX
Richard Smith avatar
drapel jp
Se pare că `/etc/nginx/conf/browsercache.conf` se potrivește cu acea adresă URL, modelul `jpe?g` se potrivește cu `jpg`.
andrewniesen avatar
drapel cn
Ei bine, asta o rezolvă, când comentez locația în `/etc/nginx/conf/browsercache.conf`, dar de ce ar afecta acest lucru stocarea în cache?
Richard Smith avatar
drapel jp
Nu are nimic de-a face cu stocarea în cache, dar [modul în care Nginx selectează un bloc `locație` pentru a procesa o solicitare](http://nginx.org/en/docs/http/request_processing.html).

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.