nginx反向代理是平常使用nginx時最經常使用到的功能之一。在配置url的過程當中,「/」的有無常常是影響咱們配置成功的關鍵,也是困擾咱們的問題所在。在此,結合實際例子,做簡要辨析。html
場景一:利用根目錄進行代理nginx
location / { proxy_pass http://example.test.com/; } location / { proxy_pass http://example.test.com; }
這兩個配置實現的效果是同樣的。url
場景二:下面四種狀況分別用http://192.168.1.10/proxy/test.html 進行訪問。spa
第一種狀況: location /proxy/ { proxy_pass http://127.0.0.1:8080/; }
實現效果:當訪問http://192.168.1.10/proxy/test.html時,會被代理到http://127.0.0.1:8080/test.html 這個url,並將結果返回給咱們。代理
第二種狀況:(相對於第一種,最後少一個 /) location /proxy/ { proxy_pass http://127.0.0.1:8080; }
實現效果:當訪問http://192.168.1.10/proxy/test.html時,會被代理到http://127.0.0.1:8080/proxy/test.html 這個url,並將結果返回給咱們。code
第三種狀況: location /proxy/ { proxy_pass http://127.0.0.1:8080/real/; }
實現效果:當訪問http://192.168.1.10/proxy/test.html時,會被代理到http://127.0.0.1:8080/real/test.html 這個url,並將結果返回給咱們。server
第四種狀況(相對於第三種,最後少一個 / ): location /proxy/ { proxy_pass http://127.0.0.1:8080/real; }
實現效果:當訪問http://192.168.1.10/proxy/test.html時,會被代理到http://127.0.0.1:81/realtest.html 這個url,並將結果返回給咱們。htm
分析以下: proxy_pass http://127.0.0.1/ 和proxy_pass http://127.0.0.1 ==>這個」/」,會使代理出來的結果徹底不一樣。blog
前者,至關於告訴nginx,我這個location,是代理訪問到http://127.0.0.1這個server的,個人location是什麼,nginx 就把location 加在proxy_pass 的 server 後面,這裏是/proxy/,因此就至關於http://127.0.0.1/proxy/。若是是location /blog/ 就是代理訪問到http://127.0.0.1/blog/。io
後者,至關於告訴nginx,我這個location,是代理訪問到http://127.0.0.1/的,http://127.0.0.1/proxy/ == http://127.0.0.1/ ,能夠這樣理解。改變location,並不能改變返回的內容,返回的內容始終是http://127.0.0.1/ 。 若是是location /blog/ ,那就是 http://127.0.0.1/blog/ == http://127.0.0.1/ 。
這樣,也能夠解釋了上面那個location / 的例子,/ 嘛,加在server 的後面,仍然是 / ,因此,兩種寫法出來的結果是同樣的。
注意: 若是是 location ~* ^/proxy/(.*)\.html 這種正則的location,是不能寫」/」上去的,nginx -t 也會報錯的了。由於,路徑都須要正則匹配了嘛,並非一個相對固定的locatin了,必然要代理到一個server。