2015-04-15 11 views
5

Forse sto facendo una domanda povera ma voglio applicare il limite di velocità in nginx basato su intestazione http personalizzata piuttosto che basata su IP. La mia configurazione basata su IP funziona ma non riesco a spostarmi usando l'intestazione http personalizzata. Quello che voglio è che se una specifica intestazione è presente nella richiesta http allora la limitazione della velocità dovrebbe essere applicata altrimenti.Limite di velocità in nginx basato sull'intestazione http

conf

 http { 
      limit_req_zone $http_userAndroidId zone=one:10m rate=1r/s; 

     location ^~ /mobileapp{ 
      set $no_cache 1; 
      # set rate limit by pulkit 
      limit_req zone=one burst=1; 
      limit_req_status 429; 
      error_page 429 /50x.html; 
     } 
} 

Tuttavia, il tasso di limitazione viene applicata anche se non v'è alcuna intestazione presente. P.S. userAndroidId è l'intestazione della mia richiesta.

risposta

3

Penso che tu possa gestirlo con la mappa. Se l'intestazione è presente, associare una variabile all'IP del client o a una stringa vuota e utilizzare tale valore come chiave della zona. Se la mappa non corrisponde, la stringa vuota impedirà il verificarsi della limitazione della velocità.

qualcosa di simile (non testato, ma dovrebbe funzionare)

map $http_userandroidid $limit { 
    default ""; 
    "~.+" $binary_remote_addr; 
} 

Ciò mappare un vuoto di perdere intestazione userAndroidId a "", e qualsiasi altro valore al $ binary_remote_addr. Puoi quindi utilizzare la variabile $ limit nella tua zona in questo modo:

limit_req_zone $limit zone=one:10m rate=1r/s; 
Problemi correlati