Puncte:1

Înlocuirea aceleiași valori de mai multe ori cu nginx sub_filter

drapel in

Editați | ×: Exemplu reproductibil: https://github.com/searchingforlife/nginx-substitution

Încerc să adaug/injectez un număr arbitrar de scripturi într-un fișier/ieșire HTML. Toate filtrează pe aceeași valoare </body> să se injecteze singuri.

Versiunea nginx: nginx/1.16.1

Imaginați-vă că avem două fișiere de configurare așa (simplificate):

# script_one.conf

sub_filter "</body>" "<script src='/one.js'></script></body>";
# script_two.conf

sub_filter "</body>" "<script src='/two.js'></script></body>";

Și fișierul nostru principal de configurare nginx:

locație /un {
  sub_filtru_o dată dezactivat;
  include /script_one.conf;
  include /script_two.conf;
}

Totuși, acest lucru nu pare să funcționeze și nginx adaugă doar primul script. Dacă valoarea filtrului este diferită (să zicem că se filtrează </head> iar celălalt pe </body>), apoi nginx injectează ambele scripturi.

Există o modalitate de a ocoli această limitare și de a face ca nginx să injecteze ambele scripturi? Știu că pot crea un nou fișier de conf care combină ambele scripturi într-unul singur și să le includă, dar care pur și simplu nu se scalează atunci când aveți peste 10 scripturi de injectat care pot fi combinate în diferite moduri, în funcție de locație.

Michael Hampton avatar
drapel cz
După cum se arată, ar trebui să funcționeze. Probabil că se întâmplă altceva. Vă rugăm să postați rezultatul lui `nginx -T`.
searchingforlife avatar
drapel in
@MichaelHampton S-a adăugat un depozit pentru a reproduce acest comportament: https://github.com/searchingforlife/nginx-substitution
mforsetti avatar
drapel tz
încercați să utilizați `">
Puncte:0
drapel us

This is speculation, I haven't verified it from nginx source code. I assume nginx stores the keys to replace in a hash structure, that is, replace x with y.

Now, when nginx reads the configuration file in order, it first adds a key </body> to the replace map, and then replaces it with the second one.

searchingforlife avatar
drapel in
Probabil ai dreptate.În schimb, m-am gândit la o abordare diferită care pare să rezolve această problemă în care rescriem o singură dată. Dacă cineva este interesat, vedeți ramura soluției: https://github.com/searchingforlife/nginx-substitution/tree/solution
Puncte:0
drapel in

Am ajuns să mă gândesc la o abordare diferită care se rescrie o singură dată. Dacă cineva este interesat, vedeți ramura soluții: https://github.com/searchingforlife/nginx-substitution/tree/solution

Practic, creăm o variabilă care conține nume de scripturi de injectat și apoi le injectăm pe toate simultan. În acest fel, ajungem să rescriem o singură dată.

locație ~ ^/ {
  setați $js_args „unu, doi”;
  include scripts.conf;
}
# scripts.conf

dacă ($js_args ~ "^$") {
  setați $js_args '';
}

setați $scripturi „”;

dacă ($js_args ~* "(,|^)unu([,]|$)") {
  setați $scripts „${scripts}<script src='/one.js'></script>”;
}

dacă ($js_args ~* "(,|^)două ([,]|$)") {
  setați $scripts „${scripts}<script src='/two.js'></script>”;
}

sub_filter „</body>” „${scripts}</body>”;

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.