Puncte:0

Nginx try_files eșuează la primul parametru și returnează 404

drapel jp

Ai grijă de mine, acesta este unul lung.

La început, am creat un server Nginx pe serverul de fișiere statice pentru compania mea și a funcționat excelent cu următorul fragment de configurare pentru servirea fișierelor:

Server {
  # o grămadă de lucruri ssl
  rădăcină /cale/la/fișiere;

  Locație / {
    include cors_support;
    sendfile activat;
    sendfile_max_chunk 1m;

    try_files $uri =404;
  }

Simplu, curat și funcțional. Până când m-am gândit că voi adăuga o altă funcție acestui server: stocarea versiunilor noastre de aplicații și furnizarea lor echipei noastre de QA. Deoarece fișierele aplicației pot fi destul de mari, am adăugat un alt volum de stocare doar pentru versiuni și m-am gândit că aș putea scăpa de asta cu o simplă modificare a configurației Nginx, după cum urmează (se arată doar porțiunile relevante):

Server {
  # în mare parte la fel
  root /new/path/to/builds;

  Locație / {
    #la fel ca inainte
    try_files $uri @cdn_files;
  }

  locație @cdn_files {
    # unele setări cors și send_file
    rădăcină /cale/la/fișiere;
    try_files $uri =404;
  }
}

Ce mă așteptam să se întâmple conform documentației:

  • cererea vine pentru un dosar
  • verifică primul bloc pentru fișier
  • fișier găsit? da=trimite fișierul nu=redirecționează către locația numită
  • locație numită -> fișier găsit? da=trimite fisierul nr=404 pagina

Ce se întâmplă de fapt:

  • cererea vine pentru un dosar
  • verifică primul bloc pentru fișier
  • fișier găsit? da=trimite fisierul nr=404 pagina

Am încercat mai multe încercări diferite de a remedia acest lucru, inclusiv câteva încercări nebunești de „bună mare”.

Aceasta produce același rezultat (pagina 404):

# ... cod irelevant
rădăcină /;
Locație / {
  # ... mai mult cod irelevant
  try_files /new/path/to/builds/$uri /path/to/files/$uri =404;
}

Aceasta produce același rezultat (pagina 404):

#...
root /new/path/to/builds;

Locație / {
  #...
  try_files $uri @cdn_files;
}

locație @cdn_files {
  #...
  rădăcină /cale/la/fișiere;
  try_files $uri =403; #rețineți că pagina livrată este 404 și NU 403
}

Acest lucru produce și un 404:

# Am eliminat directiva „rădăcină” din blocul serverului pentru acest test

Locație / {
  #...
  root /new/path/to/builds;
  try_files $uri ../realitve/path/to/files/$uri =404;
}

Alte câteva lucruri de reținut:

  • Jurnalele de erori arată doar o încercare de a localiza fișierul la primul parametru al try_files directivă.
  • Dacă fișierul există în primul parametru al try_files directivă dosarul este livrat
  • Nu cred că este relativ, dar pentru orice eventualitate: sistemul de operare este Ubuntu 16.04

Editați | ×:

  • Nginx versiunea 1.21.0
Ivan Shatsky avatar
drapel gr
Presupun că înțelegeți că fișierul va fi căutat la `root` + `uri`, adică URI-ul de solicitare `/uploads/myfile` va fi căutat mai întâi ca `/new/path/to/builds/uploads/myfile` și `/path/to/files/uploads/myfile` al doilea. În plus, nu există erori în configurația dvs. Singurul motiv pentru care pot ghici este că cererea dvs. este de fapt gestionată de o altă locație decât cea `locație / { ... }`. Cu toate acestea, pentru a fi sigur că este necesară întreaga configurație, precum și URI-ul real al cererii.
Puncte:0
drapel jp

Așa că, în cele din urmă, am reușit să fac acest lucru să funcționeze prin direcționarea cererilor mele primite pentru versiuni printr-o nouă adresă URL și, astfel, în propriul lor bloc de server, lăsând accesul la fișierul original așa cum era înainte de modificări, iar ambele URL-uri funcționează acum pentru a prelua fișiere din specifica lor. locații.

M-am uitat și am căutat pe google și m-am cântărit câteva ore, dar nu am reușit niciodată să rezolv accesarea fișierelor din mai multe directoare într-un singur bloc de server, deși din documentația ar fi trebuit să fie posibil.

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.