Puncte:1

Împiedicați regula regex Nginx să înlocuiască o altă regulă

drapel hm

Am un server Nginx care acționează ca un proxy invers pentru câteva servicii, configurația este similară cu aceasta

locație /backend/service1 {
        proxy_pass http://pathto/service1;
}

Locație / {
        rădăcină /a/folder
}

locație ~* (\.js|\.css)$
        expiră 8d;

        root /home/files/abc/bcd;
}

Problema mea aici este că recent service1 de la backend trebuie să servească câteva fișiere statice, cum ar fi /backend/service1/something/file1.js sau /backend/service1/something/style.css iar a doua locație, deoarece este o regulă de locație regex, o înlocuiește pe prima

Toate fișierele statice furnizate de backend/service1 au un anumit prefix (ceva), așa că am încercat să îmbunătățesc expresia regex din a doua locație pentru a avea un lookahead/lookbehind negativ, dar nu pare să funcționeze, probabil pentru că modelul principal trebuie să aibă o lungime fixă ​​(asta am încercat fără noroc)

locație /backend/service1 {
        proxy_pass http://pathto/service1;
}

Locație / {
        rădăcină /a/folder
}

locație ~* (?<!ceva)(.*)(\.js|\.css)$
        expiră 8d;

        root /home/files/abc/bcd;
}

Cum pot realiza acest lucru?

drapel jp
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
RabidTunes avatar
drapel hm
Am verificat deja documentele, dar după ce l-am verificat pentru a treia oară am ajuns la o soluție, vedeți răspunsul meu mai jos, așa că mulțumesc, cred
Puncte:3
drapel jp

Dacă urmează imediat „ceva”. /backend/service1, puteți adăuga un altul mai specific Locație care are prioritate față de locațiile regex:

locație /backend/service1 {
    proxy_pass http://pathto/service1;
}  
locație ^~ /backend/service1/something/ {
    proxy_pass http://pathto/service1/something/;
}  
locație ~* \.(js|css)$ { ... }

Dacă „ceva” este încorporat oriunde în URL, va trebui să utilizați o expresie regulată, eventual cu notoriu privire negativă înainte. Prin încercare și eroare, am găsit o expresie de lucru:

locație ~* ^(?!.*ceva).*\.(js|css)$ { ... }
Puncte:0
drapel hm

Am acceptat celălalt răspuns, dar ceva care a funcționat și pentru cazul meu este imbricarea locației care avea expresia regex. Ceva de genul

locație /backend/service1 {
        proxy_pass http://pathto/service1;
}

Locație / {
        Locație / {
            rădăcină /a/folder
        }

        locație ~* (\.js|\.css)$
            expiră 8d;

            root /home/files/abc/bcd;
        }
}

În acest fel, dacă URI-ul destinației este prefixat de /backend/service1, prima locație se va declanșa, pentru orice alte locații, locația / se va declanșa și apoi regex-ul poate avea efect

Richard Smith avatar
drapel jp
Această soluție nu răspunde la întrebarea dvs. Și este același cu folosirea `location ^~ /backend/service1`
RabidTunes avatar
drapel hm
De ce spui că nu răspunde la întrebarea mea? Mi-am rezolvat problema făcând asta, este greșit? Îmi va da probleme în viitor?
RabidTunes avatar
drapel hm
Voi încerca mai târziu soluția ta pentru că este mai simplă și, dacă funcționează, voi accepta răspunsul tău în favoarea al meu, dar de fapt mi-am rezolvat problema cu abordarea mea, așa că nu înțeleg comentariul tău
Richard Smith avatar
drapel jp
Nu spun că nu îți rezolvă problema și este bine că ai găsit o soluție care funcționează pentru tine. Dar întrebarea pe care ați postat-o ​​pe SF a pus-o în mod special despre un anumit prefix „ceva”, iar acest răspuns nu abordează asta.
RabidTunes avatar
drapel hm
Soluția ta funcționează și este mai simplă așa că am acceptat asta și am editat asta, mulțumesc!

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.