Puncte:0

Cum se face o redirecționare nginx excluzând o adresă IP și o cale?

drapel fr

Trebuie să redirecționez către o adresă URL, cu excepția cazului în care utilizatorul provine din adresa noastră IP internă sau dacă accesează o anumită cale.

Am incercat asta:

locație ~* /foobar {
    pauză;
}

locație ~* / {
    dacă ($adresă_la distanță != 111.222.333.444) {
        rescrie ^ https://external.tld/
    }
}

Dar asta nu pare să funcționeze. Acea configurație specială provoacă un 404 atunci când mergi la https://mydomain.tld/foobar și un „Bine ați venit la nginx!” pagina când o accesați din adresa noastră IP. Cu toate acestea, accesarea https://mydomain.tld/foobar în afara adresei noastre IP redirecționează corect către https://external.tld/

djdomi avatar
drapel za
Întrebările care caută ajutor pentru instalare, configurare sau diagnosticare trebuie să includă starea finală dorită, problema sau eroarea specifică, informații suficiente despre configurație și mediu pentru a o reproduce și soluțiile încercate. Întrebările fără o declarație clară a problemei nu sunt utile altor cititori și este puțin probabil să obțină răspunsuri bune.
Darrell Brogdon avatar
drapel fr
@djdomi Ce recomandați pentru a face declarația problemei mai clară?
djdomi avatar
drapel za
arată-ne nginx -T și explică ce înseamnă nu funcționează, momentan ne spui doar la jumătatea drumului ;)
Darrell Brogdon avatar
drapel fr
@djdomi Mulțumesc. Am adăugat mai multe clarificări la ceea ce se întâmplă cu configurația dată. Din păcate, nu am voie să postez rezultatele lui `nginx -T`.
djdomi avatar
drapel za
dacă este doar o singură adresă URL, este posibil și un subdomeniu?
Darrell Brogdon avatar
drapel fr
Nu, doar acea adresă URL.
Puncte:1
drapel gr

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.

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.