Deoarece nu doriți (sau nu aveți voie) să afișați blocul complet al serverului, voi face câteva presupuneri. Ce s-a întâmplat cel mai probabil cu configurația dvs.? Ați creat două blocuri de locații suplimentare care sunt folosite pentru procesare orice cererea primită. Verifică Locație
directivă documentație. Singurele două tipuri de locații care pot depăși o solicitare de la locația de potrivire regex sunt locația exactă (locație = /uri { ... }
) și locația prefixului nu-verificați-regex (locație ^~ /prefix { ... }
). În caz contrar, va fi aleasă prima locație de potrivire regex.
Fiecare bloc de server are directorul său rădăcină, chiar dacă nu este specificat în mod explicit folosind rădăcină
directivă. Se alege folosind prefix (specificat la timpul de compilare, poate fi verificat cu nginx -V
comanda) și /html
sufix. Să presupunem că prefixul tău nginx este /usr/share/nginx
. Apoi rădăcina dvs. implicită va fi la /usr/share/nginx/html
director, cu excepția cazului în care este specificat în mod explicit folosind rădăcină /unele/cale
directivă.
Comportamentul implicit al nginx la deservirea unei cereri poate fi descris ca try_files $uri $uri/ =404
.
Să presupunem că avem un https://mydomain.tld/foobar
cerere. Pentru a-l servi primul locație ~* /foobar { break; }
va fi aleasă ca prima locație regex potrivită. Prima directivă pauză
înseamnă că procesarea setului curent de ngx_http_rewrite_module
directivele vor fi oprite. Dar nu există niciuna dintre aceste directive (cu excepția pauză
unu) în interiorul acestui bloc de locație! Da, asta înseamnă că asta pauză
directiva este inutilă aici. În continuare, nginx va verifica existența unui /usr/share/nginx/html/foobar
fișier, un fișier index din /usr/share/nginx/html/foobar/
director (implicit este index.html
), iar după ce ambele verificări eșuează, returnați un HTTP 404 nu a fost găsit
eroare.
Acum să presupunem că avem un https://mydomain.tld/
cerere. Primul tău bloc de locație nu se va potrivi cu el, așa că al doilea locație ~* / { ... }
este ales pentru a procesa această solicitare (acest bloc de locație se va potrivi cu orice posibilă cerere validă). Dacă o verificare a adresei IP nu trece, o redirecționare îi va lua locul. Dar dacă ar trece, nginx vă va procesa cererea în același mod ca cel descris mai sus, returnând bun venit implicit index.html
dosarul din /usr/share/nginx/html/
director.
Se pare că nu înțelegi cum directivele de la ngx_http_rewrite_module
sunt procesate. Citiți din nou prima parte a documentației:
The pauză
, dacă
, întoarcere
, rescrie
, și a stabilit
directivele sunt procesate în următoarea ordine:
- directivele acestui modul specificate la nivel de server sunt executate secvenţial;
- repetat:
- o locație este căutată pe baza unui URI de solicitare;
- directivele acestui modul specificate în locația găsită sunt executate secvențial;
- bucla se repetă dacă un URI de solicitare a fost rescris, dar nu de mai mult de 10 ori.
Puteți plasa cecurile la nivel de bloc de server:
dacă ($uri = /foobar) {
pauză;
}
dacă ($adresă_la distanță != 111.222.333.444) {
rescrie ^ https://external.tld/
}
Cele de mai sus pauză
directiva va funcționa conform așteptărilor, o execuție a ngx_http_rewrite_module
directivele la nivel de server vor fi oprite. Asta înseamnă că orice altă directivă din acel modul (cum ar fi a stabilit
, dacă
, întoarcere
, rescrie
etc.), dacă există, ar trebui să fie plasate inainte de blocul de mai sus. Asta nu se aplică la ngx_http_rewrite_module
directive plasate la nivel de locație.
Mai există un avertisment posibil. Dacă ale tale https://mydomain.tld/foobar
pagina folosește orice elemente (scripturi, stiluri, imagini etc.), accesul la acele elemente ar trebui să fie permis. De exemplu, puteți modifica condiția pentru a permite orice început cu /foobar
prefix folosind if ($uri ~* ^/foobar) { break; }
bloc. Dacă adresele lor nu pot fi verificate cu un singur regex, puteți folosi mai multe if (...) { break; }
blocuri.