1.nginx請求頭配置:
1.nginx proxy_set_header設置,自定義header
在實際應用中,我們可能需要獲取用戶的ip地址,比如做異地登陸的判斷,或者統計ip訪問次數等,通常情況下我們使用
request.getRemoteAddr()就可以獲取到客戶端ip,但是當我們使用了nginx作為反向代理后,使用request.getRemoteAddr()
獲取到的就一直是nginx服務器的ip的地址,那這時應該怎么辦?
而且有些場景做了一些客戶端瀏覽器url的判斷,比如,瀏覽器輸入baidu.com是可以訪問到百度的,但是輸入!@#¥*.com有可能
也是可以訪問到百度,但是百度內部並不希望以這種方式訪問(或者防止一些網絡攻擊),這時候應該怎么辦?
其實nginx允許重新定義或者添加發往后端服務器的請求頭。value可以包含文本、變量或者它們的組合。
2.默認情況下,有兩個請求頭會被重新定義:
proxy_set_header Host $proxy_host; //默認會將后端服務器的HOST填寫進去
proxy_set_header Connection close;
3.我們可以通過設置nginx配置去調整轉發報文的頭部:
proxy_set_header X-real-ip $remote_addr;
其中這個X-real-ip是一個自定義的變量名,名字可以隨意取,這樣做完之后,用戶的真實ip就被放在X-real-ip這個變量里了
,然后,在web端可以這樣獲取:request.getHeader("X-real-ip")
4.proxy_set_header X-Forwarded-For $remote_addr;
真實的顯示出客戶端原始ip。(nginx更多使用這條配置,X-Forwarded-For為默認字段,以下介紹均為默認字段)
5.proxy_set_header Host $http_host;
如果想獲取客戶端訪問的頭部,可以這樣來設置。
但是,如果客戶端請求頭中沒有攜帶這個頭部,那么傳遞到后端服務器的請求也不含這個頭部。
6.proxy_set_header Host $host;
這個配置相當於上面配置的增強。
它的值在請求包含"Host"請求頭時為"Host"字段的值,在請求未攜帶"Host"請求頭時為虛擬主機的主域名。
7.proxy_set_header Host $host:$proxy_port;
服務器名和后端服務器的端口(訪問端口)一起傳送。
proxy_set_header <<<*>>> "";
請求頭的值為空,請求頭將不會傳送給后端服務器。
8.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
在默認情況下經過proxy轉發的請求,在后端看來遠程地址都是proxy端的ip 。
添加這條配置之后:
意思是增加一個$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆蓋,當然由於默認的
X-Forwarded-For值是空的,所以我們總感覺X-Forwarded-For的值就等於$proxy_add_x_forwarded_for的值,實際上當你搭建
兩台nginx在不同的ip上,並且都使用了這段配置,那你會發現在web服務器端通過request.getHeader("X-Forwarded-For")獲得
的將會是客戶端ip和第一台nginx的ip。
在第一台nginx中,使用
9.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
現在的$proxy_add_x_forwarded_for變量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的
值是用戶的ip,於是賦值以后,X-Forwarded-For變量的值就是用戶的真實的ip地址了。
到了第二台nginx,也使用
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
現在的$proxy_add_x_forwarded_for變量,
X-Forwarded-For部分包含的是用戶的真實ip,
$remote_addr部分的值是上一台nginx的ip地址,
於是通過這個賦值以后現在的X-Forwarded-For的值就變成了"用戶的真實ip,第一台nginx的ip"。。
轉載: