Puncte:0

Directiva „locație” nu are efect atunci când conține o variabilă

drapel no

Ceea ce vreau

Pentru a mea /admin locație, lista albă mai multe adrese IP de încredere și blocați pe toți ceilalți.

Ceea ce am

http {
    hartă $admin_la distanță $admin_block_path {
        implicit „/admin”;
        1.1.1.1 „/not-admin”;
        8.8.8.8 „/not-admin”;
    }

    # â¦

    Server {
        add_header X-Test-Admin „$admin_block_path”;
        locație $admin_block_path {
            întoarce 403;
        }
    }

}

Ideea este să utilizare Hartă determinați condiționat o cale de blocare de la adresa IP a unui vizitator. Stocați-l într-o variabilă și utilizați acea variabilă în Locație. Dacă cererea provine de la un IP nede încredere, variabila va conține /admin, și, prin urmare, locația se va bloca /admin.

Care este problema

The Locație nu blochează accesul la /admin.

  • pot confirma folosind add_header că variabila este setată corect pe baza adresei IP. Când vizitez de pe un IP care nu este de încredere, primesc /admin, și respectiv /non-admin când vizitați de pe un IP de încredere.
  • Daca inlocuiesc locație $admin_block_path cu hardcoded locatie /admin, cererea este blocată
  • Am încercat să joc cu ghilimele duble, fără efect
  • Am încercat să scot bara oblică în afara variabilei, fără efect

Notă

Din păcate, nu pot pur și simplu hardcode permite/nega în unele /admin locație, deoarece asta ar suprascrie configurația PHP pass pe care o am în altă parte în config. Din această cauză, trebuie să am un dedicat /admin locație numai dacă știu că voi respinge solicitarea oricum și nu va fi nevoie de PHP.

Versiunea Nginx: 1.20.1

Puncte:3
drapel gr

Toate locațiile din configurația nginx sunt compilate la pornire. Nu puteți folosi variabile pentru Locație parametru de directivă (de asemenea, nu puteți utiliza variabile în interiorul modelelor regex sau cu alte directive). Mai mult, atunci când documentația directivei nginx nu afirmă în mod explicit că puteți utiliza variabile pentru parametrul unei directive, în general înseamnă că nu puteți. Ar trebui să folosiți o altă tehnică pentru a obține ceea ce doriți. Una dintre soluții poate fi următoarea:

hartă $admin_la distanță $admin_block_path {
    1.1.1.1 "";
    8.8.8.8 "";
    implicit 1;
}

Server {
    dacă ($admin_block_path) {
        rescrie ^/admin /blocked;
    }
    locație = /blocked {
        intern;
        întoarce 403;
    }
    ...
}

O locație de potrivire exactă are o prioritate mai mare față de cea regex, așa că nu ar trebui să rupă configurația handler-ului PHP. Făcând acea locație internă, puteți fi sigur că nu va fi accesibilă direct (doar prin regula de rescriere).

mehov avatar
drapel no
Vă mulțumim pentru ajutor, această abordare a funcționat

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.