詳解proxy_pass根據(jù)path路徑轉(zhuǎn)發(fā)時(shí)的"/"問(wèn)題記錄
在nginx中配置proxy_pass時(shí),如果是按照^~匹配路徑時(shí),要注意proxy_pass后的url最后的/。當(dāng)加上了/,相當(dāng)于是絕對(duì)根路徑,則nginx不會(huì)把location中匹配的路徑部分代理走;如果沒(méi)有/,則會(huì)把匹配的路徑部分也給代理走。
比如下面設(shè)置:
location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; proxy_pass http://js.test.com/; }
如上面的配置,如果請(qǐng)求的url是http://servername/wangshibo/test.html會(huì)被代理成http://js.test.com/test.html
而如果這么配置
location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; proxy_pass http://js.test.com; }
則請(qǐng)求的url是http://servername/wangshibo/test.html會(huì)被代理到http://js.test.com/wangshibo/test.html
當(dāng)然,可以用如下的rewrite來(lái)實(shí)現(xiàn)/的功能
location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; rewrite /wangshibo/(.+)$ /$1 break; proxy_pass http://js.test.com; }
列舉下面一例
1)第一種配置
[root@BJLX_16_202_V vhosts]# cat ssl-wangshibo.conf upstream at { server 192.168.1.202:8080 max_fails=3 fail_timeout=30s; } server { listen 443; server_name www.wangshibo.com; ssl on; ### SSL log files ### access_log logs/wangshibo_access.log; error_log logs/wangshibo_error.log; ### SSL cert files ### ssl_certificate ssl/wang.cer; ssl_certificate_key ssl/wang.key; location /attendance/ { proxy_pass http://at; //不需要加上"/" proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; } }
訪問(wèn)https://www.wangshibo.com/attendance/和http://192.168.1.202:8080/attendance結(jié)果是一致的。
2)第二種配置
[root@BJLX_16_202_V vhosts]# cat ssl-wangshibo.conf upstream at { server 192.168.1.202:8080 max_fails=3 fail_timeout=30s; } server { listen 443; server_name www.wangshibo.com; ssl on; ### SSL log files ### access_log logs/wangshibo_access.log; error_log logs/wangshibo_error.log; ### SSL cert files ### ssl_certificate ssl/wang.cer; ssl_certificate_key ssl/wang.key; location / { proxy_pass http://at/attendance/; //一定要加上"/" proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; } }
訪問(wèn)https://www.wangshibo.com和http://192.168.1.202:8080/attendance結(jié)果是一致的。
如下配置,想要實(shí)現(xiàn)的需求:
192.168.1.27是后端的real server,8080端口是公司的ehr人事系統(tǒng)端口。
又由于該系統(tǒng)涉及到微信接口訪問(wèn),即http://ehr.wang.com/attendance和http://ehr.wang.com/app
由于是內(nèi)部系統(tǒng),安全考慮,所以要求:
1)登錄ehr人事系統(tǒng)的時(shí)候要求使用內(nèi)網(wǎng)登錄,即http://192.168.1.27:8080,訪問(wèn)前要先登錄公司VPN
2)登錄微信接口http://ehr.wang.com/attendance和http://ehr.wang.com/app使用外網(wǎng)登錄,即使用解析后域名登錄。
3)訪問(wèn)http://ehr.wang.com,強(qiáng)制跳轉(zhuǎn)為https://ehr.wang.com/attendance
[root@BJLX_4_21_P vhosts]# cat ehr.conf server { listen 80; server_name ehr.wang.com; access_log logs/ehr_access.log; error_log logs/ehr_error.log; return 301 https://$server_name$request_uri; } [root@BJLX_4_21_P vhosts]# cat ssl-ehr.conf upstream ehr { server 192.168.1.27:8080 max_fails=3 fail_timeout=30s; } server { listen 443; server_name ehr.wang.com; ssl on; ### SSL log files ### access_log logs/ehr_access.log; error_log logs/ehr_error.log; ### SSL cert files ### ssl_certificate ssl/wang.cer; ssl_certificate_key ssl/wang.key; #ssl_session_timeout 5m; location / { return 301 https://ehr.wang.com/attendance; } location /attendance/ { proxy_pass http://ehr; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto https; #proxy_set_header X-Forwarded-Proto https; proxy_redirect off; } location /app/ { proxy_pass http://ehr; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto https; #proxy_set_header X-Forwarded-Proto https; proxy_redirect off; } }
注意:
由于從瀏覽器訪問(wèn)(http)到源站的real server之間要經(jīng)過(guò)Nginx反向代理層(https)
需要將proxy_set_header X-Forwarded-Proto https;這一行注釋掉,否則上面的配置無(wú)效。
如果中間沒(méi)有代理層,直接是在real server本機(jī)進(jìn)行nginx的反向代理(即本機(jī)nginx反代到本機(jī)的8080端口),則這個(gè)參數(shù)無(wú)效注釋(已經(jīng)過(guò)驗(yàn)證)
HTTP頭域(proxy_set_header)列表與解釋
HTTP 頭域是HTTP協(xié)議中請(qǐng)求(request)和響應(yīng)(response)中的頭部信息,其實(shí)就是HTTP通信的操作參數(shù),告訴web服務(wù)器和瀏覽器怎樣處理這個(gè)通信。
HTTP頭從一個(gè)請(qǐng)求信息或者響應(yīng)信息的第二行開(kāi)始(第一行是請(qǐng)求行或者響應(yīng)行),以兩個(gè)CR-LF字符組結(jié)束(CR:回車符,\r,LF:換行符\n)
而每個(gè)HTTP頭是字符串形式的,用冒號(hào)分割的鍵值對(duì),多個(gè)HTTP頭之間用CR-LF字符組隔開(kāi)。
某些http頭可以有注釋,例如user-agent,server,via。但這些注釋會(huì)被服務(wù)器或者瀏覽器忽略IETF組織已經(jīng)將一些核心的HTTP頭定義在RFC2616規(guī)范中,
這些HTTP頭是每個(gè)基于HTTP協(xié)議的軟件必須實(shí)現(xiàn)的,而其他一些更新和擴(kuò)展的頭域也必須被基于HTTP的軟件實(shí)現(xiàn)。當(dāng)然,各個(gè)軟件也可以定義自己的頭域。
另一方面,RFC2616規(guī)范中并沒(méi)有限制每個(gè)HTTP頭的長(zhǎng)度,或者限制HTTP頭的數(shù)量,但出于性能和安全的考慮,多數(shù)服務(wù)器都會(huì)自己作規(guī)定,例如apache2.3
就規(guī)定每個(gè)HTTP頭不能超過(guò)8190個(gè)字節(jié),每個(gè)請(qǐng)求不能超過(guò)100個(gè)HTTP頭。
以下來(lái)看看發(fā)送一個(gè)請(qǐng)求(request)時(shí)候,可能包含的各個(gè)HTTP頭和它的解釋。
標(biāo)準(zhǔn)的請(qǐng)求頭--
Accept: 瀏覽器(或者其他基于HTTP的客戶端程序)可以接收的內(nèi)容類型(Content-types),例如 Accept: text/plain
Accept-Charset:瀏覽器能識(shí)別的字符集,例如 Accept-Charset: utf-8
Accept-Encoding:瀏覽器可以處理的編碼方式,注意這里的編碼方式有別于字符集,這里的編碼方式通常指gzip,deflate等。例如 Accept-Encoding: gzip, deflate
Accept-Language:瀏覽器接收的語(yǔ)言,其實(shí)也就是用戶在什么語(yǔ)言地區(qū),例如簡(jiǎn)體中文的就是 Accept-Language: zh-CN
Authorization:在HTTP中,服務(wù)器可以對(duì)一些資源進(jìn)行認(rèn)證保護(hù),如果你要訪問(wèn)這些資源,就要提供用戶名和密碼,這個(gè)用戶名和密碼就是在Authorization頭中附帶的,格式是“username:password”字符串的base64編碼,例如:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==中,basic指使用basic認(rèn)證方式, QWxhZGRpbjpvcGVuIHNlc2FtZQ==使用base64解碼就是“Aladdin:open sesame”
Cache-Control:這個(gè)指令在request和response中都有,用來(lái)指示緩存系統(tǒng)(服務(wù)器上的,或者瀏覽器上的)應(yīng)該怎樣處理緩存,因?yàn)檫@個(gè)頭域比較重要,特別是希望使用緩 存改善性能的時(shí)候,內(nèi)容也較多,所以我想在下一篇博文中主要介紹一下。
Connection:告訴服務(wù)器這個(gè)user agent(通常就是瀏覽器)想要使用怎樣的連接方式。值有keep-alive和close。http1.1默認(rèn)是keep-alive。keep-alive就是瀏覽器和服務(wù)器 的通信連接會(huì)被持續(xù)保存,不會(huì)馬上關(guān)閉,而close就會(huì)在response后馬上關(guān)閉。但這里要注意一點(diǎn),我們說(shuō)HTTP是無(wú)狀態(tài)的,跟這個(gè)是否keep-alive沒(méi)有關(guān)系,不要認(rèn)為keep-alive是對(duì)HTTP無(wú)狀態(tài)的特性的改進(jìn)。
Cookie:瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí)發(fā)送cookie,或者服務(wù)器向?yàn)g覽器附加cookie,就是將cookie附近在這里的。例如:Cookie:user=admin
Content-Length:一個(gè)請(qǐng)求的請(qǐng)求體的內(nèi)存長(zhǎng)度,單位為字節(jié)(byte)。請(qǐng)求體是指在HTTP頭結(jié)束后,兩個(gè)CR-LF字符組之后的內(nèi)容,常見(jiàn)的有POST提交的表單數(shù)據(jù),這個(gè)Content-Length并不包含請(qǐng)求行和HTTP頭的數(shù)據(jù)長(zhǎng)度。
Content-MD5:使用base64進(jìn)行了編碼的請(qǐng)求體的MD5校驗(yàn)和。例如:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Type:請(qǐng)求體中的內(nèi)容的mime類型。通常只會(huì)用在POST和PUT方法的請(qǐng)求中。例如:Content-Type: application/x-www-form-urlencoded
Date:發(fā)送請(qǐng)求時(shí)的GMT時(shí)間。例如:Date: Tue, 15 Nov 1994 08:12:31 GMT
Expect:指示需要使用服務(wù)器某些特殊的功能。(這個(gè)我不是很清楚)
From:發(fā)送這個(gè)請(qǐng)求的用戶的email地址。例如:From: user@example.com
Host:被服務(wù)器的域名或IP地址,如果不是通用端口,還包含該端口號(hào),例如:Host: www.some.com:182
If-Match:通常用在使用PUT方法對(duì)服務(wù)器資源進(jìn)行更新的請(qǐng)求中,意思就是,詢問(wèn)服務(wù)器,現(xiàn)在正在請(qǐng)求的資源的tag和這個(gè)If-Match的tag相不相同,如果相同,則證明服務(wù)器上的這個(gè)資源還是舊的,現(xiàn)在可以被更新,如果不相同,則證明該資源被更新過(guò),現(xiàn)在就不用再更新了(否則有可能覆蓋掉其他人所做的更改)。
If-Modified-Since:詢問(wèn)服務(wù)器現(xiàn)在正在請(qǐng)求的資源在某個(gè)時(shí)間以來(lái)有沒(méi)有被修改過(guò),如果沒(méi)有,服務(wù)器則返回304狀態(tài)來(lái)告訴瀏覽器使用瀏覽器自己本地的緩存,如果有修改過(guò),則返回200,并發(fā)送新的資源(當(dāng)然如果資源不存在,則返回404。)
If-None-Match:和If-Modified-Since用意差不多,不過(guò)不是根據(jù)時(shí)間來(lái)確定,而是根據(jù)一個(gè)叫ETag的東西來(lái)確定。關(guān)于etag我想在下一篇博客介紹一下。
If-Range:告訴服務(wù)器如果這個(gè)資源沒(méi)有更改過(guò)(根據(jù)If-Range后面給出的Etag判斷),就發(fā)送這個(gè)資源中在瀏覽器缺少了的某些部分給瀏覽器,如果該資源以及被修改過(guò),則將整個(gè)資源重新發(fā)送一份給瀏覽器。
If-Unmodified-Since:詢問(wèn)服務(wù)器現(xiàn)在正在請(qǐng)求的資源在某個(gè)時(shí)刻以來(lái)是否沒(méi)有被修改過(guò)。
Max-Forwards:限制請(qǐng)求信息在代理服務(wù)器或網(wǎng)關(guān)中向前傳遞的次數(shù)。
Pragma:好像只有一個(gè)值,就是:no-cache。Pragma:no-cache 與cache-control:no-cache相同,只不過(guò)cache-control:no-cache是http1.1專門指定的,而Pragma:no-cache可以在http1.0和1.1中使用
Proxy-Authorization:連接到某個(gè)代理時(shí)使用的身份認(rèn)證信息,跟Authorization頭差不多。例如:Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range:在HTTP頭中,"Range"字眼都表示“資源的byte形式數(shù)據(jù)的順序排列,并且取其某一段數(shù)據(jù)”的意思。Range頭就是表示請(qǐng)求資源的從某個(gè)數(shù)值到某個(gè)數(shù)值間的數(shù)據(jù),例如:Range: bytes=500-999 就是表示請(qǐng)求資源從500到999byte的數(shù)據(jù)。數(shù)據(jù)的分段下載和多線程下載就是利用這個(gè)實(shí)現(xiàn)的。
Referer:指當(dāng)前請(qǐng)求的URL是在什么地址引用的。例如在www.a.com/index.html頁(yè)面中點(diǎn)擊一個(gè)指向www.b.com的超鏈接,那么,這個(gè)www.b.com的請(qǐng)求中的Referer就是www.a.com/index.html。通常我們見(jiàn)到的圖片防盜鏈就是用這個(gè)實(shí)現(xiàn)的。
Upgrade:請(qǐng)求服務(wù)器更新至另外一個(gè)協(xié)議,例如:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent:通常就是用戶的瀏覽器相關(guān)信息。例如:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0
Via:用來(lái)記錄一個(gè)請(qǐng)求經(jīng)過(guò)了哪些代理或網(wǎng)關(guān)才被送到目標(biāo)服務(wù)器上。例如一個(gè)請(qǐng)求從瀏覽器出發(fā)(假設(shè)使用http/1.0),發(fā)送給名為 SomeProxy的內(nèi)部代理,然后被轉(zhuǎn)發(fā)至www.somenet.com的公共代理(使用http/1.1),最后被轉(zhuǎn)發(fā)至目標(biāo)服務(wù)器www.someweb.com,那么在someweb.com中收到的via 頭應(yīng)該是: via:1.0 someProxy 1.1 www.someweb.com(apache 1.1)
Warning:記錄一些警告信息。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解使用ChatGPT解決Nginx反向代理的問(wèn)題
這篇文章主要為大家介紹了使用ChatGPT解決Nginx反向代理的問(wèn)題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03nginx配置gzip壓縮優(yōu)化傳輸效率加快頁(yè)面訪問(wèn)速度的問(wèn)題
本文介紹了如何在nginx服務(wù)器中配置gzip壓縮,通過(guò)壓縮HTTP響應(yīng)內(nèi)容,減少數(shù)據(jù)傳輸大小和響應(yīng)時(shí)間,從而提升網(wǎng)站性能和訪問(wèn)速度,感興趣的朋友跟隨小編一起看看吧2024-09-09nginx中封禁ip和允許內(nèi)網(wǎng)ip訪問(wèn)的實(shí)現(xiàn)示例
Nginx不僅僅只是一款反向代理和負(fù)載均衡服務(wù)器,本文主要介紹了nginx中封禁ip和允許內(nèi)網(wǎng)ip訪問(wèn)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03nginx基于域名,端口,不同IP的虛擬主機(jī)設(shè)置的實(shí)現(xiàn)
這篇文章主要介紹了nginx基于域名,端口,不同IP的虛擬主機(jī)設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Nginx與安全相關(guān)的幾個(gè)配置小結(jié)
Nginx提供了一系列的安全相關(guān)參數(shù),可以幫助加固網(wǎng)站安全性,本文主要介紹了Nginx與安全相關(guān)的幾個(gè)配置小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Nginx?ingress?controller高可用的實(shí)現(xiàn)
本文主要介紹了Nginx?ingress?controller高可用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06LNMP 解決Access Denied錯(cuò)誤詳細(xì)介紹
這篇文章主要介紹了LNMP 解決Access Denied錯(cuò)誤詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10修改nginx服務(wù)器類型實(shí)現(xiàn)簡(jiǎn)單偽裝(隱藏nginx類型與版本等)
這篇文章主要介紹了修改nginx服務(wù)器類型實(shí)現(xiàn)簡(jiǎn)單偽裝(隱藏nginx類型與版本等),需要的朋友可以參考下2016-03-03nginx配置限制同一個(gè)ip的訪問(wèn)頻率方法
今天小編就為大家分享一篇nginx配置限制同一個(gè)ip的訪問(wèn)頻率方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08