În documentația oficială Nginx există un articol celebru intitulat „If is Evil”: folosirea instrucțiunii if în interiorul blocurilor location provoacă adesea comportamente imprevizibile, ignorarea directivelor de rutare și chiar segfault-uri de memorie. Soluția elegantă, sigură și extrem de rapidă recomandată de arhitectura Nginx este directiva map, care evaluează o variabilă sursă și produce o variabilă nouă folosind un tabel hash pre-compilat.
Exemplul #1: Negocierea corectă a conexiunilor WebSocket
# În contextul http din /etc/nginx/nginx.conf:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name socket.dexblog.ro;
location /ws/ {
proxy_pass http://localhost:4000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
# Dacă clientul nu trimite antet Upgrade, conexiunea este marcată 'close':
proxy_set_header Connection $connection_upgrade;
}
}
Exemplul #2: Bypass selectiv de Cache pentru utilizatori autentificați
# Dacă utilizatorul are cookie de login sau trimite antet Authorization, setăm variabila la 1:
map $http_cookie $no_cache {
default 0;
~*wordpress_logged_in 1;
~*PHPSESSID 1;
}
server {
location / {
proxy_pass http://backend;
# Ocolim cache-ul dacă variabila calculată este 1:
proxy_cache_bypass $no_cache;
proxy_no_cache $no_cache;
}
}