Puncte:0

De ce nginx „return 301” și âtry_filesâ cad într-o buclă infinită

drapel dk

codul meu de conf:

index index.html index.php;
Locație / {
    dacă ($uri = '/a/') {
        returnează 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

Dacă url este /A/, 301 la /A, atunci try_files parte, adaugă / la /A termina, deveni /A/.

Următorul pas, cred că va încerca index definiție, deveni /a/index.html, și ajungeți la fișier.

Dar, de fapt, a încercat /A/, și sari afară Locație, apoi intră în Locație din nou, să dacă ($uri = '/a/') { ... }.

Apoi o buclă infinită.

De ce, pur și simplu m-am încurcat.


Ceea ce vreau să fac este

  1. La cerere example.com/a/, sari la exemplu.com/a, apoi la 2
  2. La cerere exemplu.com/a, spectacol example.com/a/index.html (dar URL-ul este exemplu.com/a).

Ma poate ajuta cineva sa ajung la asta?

Puncte:2
drapel cz

Face exact ceea ce este menit să facă.

Nu poți ajunge niciodată /a/index.html pentru că tot redirecționezi înapoi către /A înainte ca acest lucru să se poată întâmpla. Când nginx procesează acest lucru, vede directorul de pe sistemul de fișiere și redirecționează automat (corect) către /A/.

Ar trebui să eliminați această redirecționare inadecvată.

drapel dk
Ați vrut să spuneți când încercați`$uri/`, mai întâi `/a/` apoi `/a/indx.html`? (și `/a/` declanșează reintroduceți `locație` înapoi la `/a`.)
digijay avatar
drapel mx
Da, asta îi spune redirecționarea dvs. 301 nginx să facă
Michael Hampton avatar
drapel cz
@nanxiaobei Nu trebuie să încercați niciodată fișierele pentru că dacă este procesat mai întâi. Și **nu puteți elimina bara oblică finală atunci când difuzați conținut static**. Este obligatoriu. Nu mai incerca.
drapel dk
@MichaelHampton Mulțumesc.Eroarea nginx afișată a fost „buclă infinită”, așa că cred că mai întâi `if`, apoi `$uri/`, apoi înapoi la `if` - deci ca o buclă. Când `dacă` este procesat, schimbat în `/a`, deci trebuie să fie `/a/` din nou, va reveni în `dacă`.
Puncte:0
drapel sv

Bun venit la ServerFault. Puteți face ceea ce este menționat în OP cu următorul cod...

Locație / {
    dacă ($uri = '/a/') {
        returnează 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

Vă rugăm să vedeți întrebarea relevantă și răspunsul acceptat la Eliminarea slash-ului final dintr-o adresă URL cu nginx .

Practic, nu trebuie să ne bazăm pe index și mai degrabă servi index.html direct când exemplu.com/a este solicitat.

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.