Puncte:1

Nginx try_files nu funcționează în blocul serverului

drapel ar
http {
include mime.tipuri;
aplicație de tip_default/octet-stream;

Server {
    root/site-uri web;
    asculta 80;
    nume_server gazdă locală;

    # nu funcționează
    try_files /logo.png /logo.jpg /error;

    # lucrări
    rescrie ^/e /eroare;

    # lucrări
    # returnează 200 „$request_uri Gestionat de blocul serverului”;

    Locație / {
        default_type text/plain;
        returnează 200 „Prefixul rădăcină potrivit”;
    }

    locație / eroare {
        default_type text/plain;
        returnează 404 „Sigla nu a fost găsită”;
    }
}

Vreau să știu care este cauza acestei evaluări, nu am găsit nicio explicație de încredere nici pe documentație, nici pe forumuri.

Apropo, am experimentat următorul scenariu:

  • A fost eliminată locația/{} bloc și a funcționat conform intenției. Știu că atunci când cererea este făcută către server, aceasta este evaluată mai întâi de către server bloc și apoi blocuri de locație potrivite. Dar se pare try_files directiva este ignorată (DE CE?!!). Dacă am dreptate ultimul argument al try_files directiva rescrie URI-ul, astfel încât acesta ar trebui să se comporte ca o rescrie directivă. Atât directivele de rescriere, cât și cele de returnare au funcționat conform intenției, au evaluat de fiecare dată, indiferent dacă există locații blocați sau nu potrivirile.

Am cercetat mult pentru a găsi informații de încredere care să explice această situație, dar nu am găsit. Așadar, întreb aici răspunsul sau sursa despre interiorul Nginx pe cineva care știe.

Richard Smith avatar
drapel jp
Presupunerea dvs. că „a fost evaluat mai întâi prin blocarea serverului” nu este corectă.
Safar Safarli avatar
drapel ar
@RichardSmith. Mulțumesc pentru atenție. Poti te rog sa explici de ce?
Ivan Shatsky avatar
drapel gr
@SafarSafarli Pe lângă ceea ce a spus deja Richard Smith, ar trebui să știți că există alte faze de procesare a cererii. Consultați [documentația de dezvoltare nginx](http://nginx.org/en/docs/dev/development_guide.html#http_phases) sau [acest articol](http://www.nginxguts.com/phases/) pentru mai multe informații. Directivele de la `ngx_http_rewrite_module` plasate la nivel de server procesate în timpul `NGX_HTTP_SERVER_REWRITE_PHASE`, în timp ce directiva `try_files` procesată în timpul `NGX_HTTP_PRECONTENT_PHASE`.
Safar Safarli avatar
drapel ar
@IvanShatsky, Mulțumesc pentru atenție.
Safar Safarli avatar
drapel ar
@IvanShatsky Am citit secțiunea articolului pe care l-ați furnizat.Dar mi s-a părut un pic dificil de înțeles, de exemplu: „`ngx_http_try_files_module` și `ngx_http_mirror_module` își înregistrează handlerii în această fază...”. Apelarea `ngx_http_try_files_module` ca modul este confuză, nu ar trebui să fie folosit cuvântul „directiv”?
Ivan Shatsky avatar
drapel gr
@SafarSafarli Directiva `try_files` se află de fapt în propriul [`ngx_http_try_files_module`](https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_try_files_module.c), mai degrabă decât în ​​[`ngx_http_core_module` ](https://github.com/nginx/nginx/blob/master/src/http/ngx_http_core_module.c) (consultați linkurile furnizate GitHub către codul sursă nginx).
Safar Safarli avatar
drapel ar
@IvanShatsky, atunci, de ce este pus ca o directivă a modulului de bază? https://nginx.org/en/docs/http/ngx_http_core_module.html. Este atât de confuz
Ivan Shatsky avatar
drapel gr
@SafarSafarli Am găsit un răspuns la întrebarea ta. A fost directiva modulului de bază până la o reproiectare care a avut loc în 2017. Până când directiva `try_files` folosea o `TRY_FILES_PHASE` specială care era disponibilă exclusiv pentru `try_files` și nicio altă directivă. Odată cu reproiectarea, a fost adăugat noul `PRECONTENT_PHASE` la fluxul de lucru de procesare a cererilor nginx, iar implementarea directivei `try_files` a fost mutată într-un modul separat folosind acea fază. Acum, orice modul terță parte poate folosi acest nou `PRECONTENT_PHASE` împreună cu `nginx_http_try_files_module`.
Ivan Shatsky avatar
drapel gr
@SafarSafarli Deci, cred că echipa nginx a decis să nu rescrie documentația. Există o mică diferență din punctul de vedere al utilizatorului final. Totuși, nu puteți dezactiva nici `nginx_http_core_module`, nici `nginx_http_try_files_module` când construiți nginx din surse. Puteți consulta commit-ul de reproiectare menționat mai sus la sursa nginx [aici](https://github.com/nginx/nginx/commit/129b06dc5dfab7b4513a4f274b3778cd9b8a6a22).
Puncte:0
drapel jp

Vedea modul în care nginx procesează o solicitare. Dar voi adăuga câteva avertismente care abordează în mod specific întrebarea dvs. și sunt ușor de observat, dar este posibil să nu fie bine documentate.

Tu mentionezi rescrie și întoarcere directive, dar acestea aparțin ngx_http_rewrite_module care au propriile reguli de evaluare și nu se comportă la fel ca directivele de bază. ai dreptate ca rescrie și întoarcere în Server contextul se poate executa înainte de Locație bloc este selectat.

După cum ați observat (cu excepția ngx_http_rewrite_module), cel Server contextul acționează ca implicit Locație, adică dacă nu altul Locație bloc corespunde cererii. Prezența unui explicit Locație / { ... } blocul va avea întotdeauna prioritate.

Safar Safarli avatar
drapel ar
Am înțeles, dar întrebarea mea este în principal despre directiva „try_files”. Vă rog, puteți oferi mai multe informații despre el. În acest caz, în contextul serverului. Mulțumiri
Richard Smith avatar
drapel jp
Nu am mai multe informații, așa cum am spus, acesta este un comportament observat.

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.