nginx中斜杠(‘/‘)的具體使用
一、Location
nginx每個(gè)location都是一個(gè)匹配目錄,nginx的策略是:訪問請(qǐng)求來時(shí),會(huì)對(duì)訪問地址進(jìn)行解析,從上到下逐個(gè)匹配,匹配上就執(zhí)行對(duì)應(yīng)location大括號(hào)中的策略,并根據(jù)策略對(duì)請(qǐng)求作出相應(yīng)。
依訪問地址:http://www.wandouduoduo.com/wddd/index.html
為例,nginx配置如下:
location /wddd/ { proxy_connect_timeout 18000; ##修改成半個(gè)小時(shí) proxy_send_timeout 18000; proxy_read_timeout 18000; proxy_pass http://127.0.0.1:8080; }
那訪問時(shí)就會(huì)匹配這個(gè)location,從而把請(qǐng)求代理轉(zhuǎn)發(fā)到本機(jī)的8080端口的Tomcat服務(wù)中,Tomcat響應(yīng)后,信息原路返回。
1.1 location沒有’/’
請(qǐng)求就可以模糊匹配以字符串開頭的所有字符串
1.2 location有’/’
只能精確匹配字符本身。
舉例: 配置 location /wandou 可以匹配 /wandoudouduo 請(qǐng)求,也可以匹配 /wandou*/duoduo
等等,只要以 wandou 開頭的目錄都可以匹配到。而 location /wandou/ 必須精確匹配 /wandou/ 這個(gè)目錄的請(qǐng)求,
不能匹配 /wandouduoduo/ 或 /wandou*/duoduo 等請(qǐng)求。
二、URL自動(dòng)加’/’
有時(shí)候訪問的地址要求后面以 / 結(jié)尾,如果用戶忘記輸入 /,Nginx 就會(huì)自動(dòng)加上 /。
通過一個(gè)例子來演示問題:
server { listen 80; server_name localhost; location / { root html; index index.html; } }
要想訪問上述資源,很簡(jiǎn)單,只需要通過 http://192.168.200.133 直接就能訪問,地址后面不需要加 /,但是如果將上述的配置修改為如下內(nèi)容:
server { listen 80; server_name localhost; location /frx { root html; index index.html; } }
這個(gè)時(shí)候,要想訪問上述資源,按照上述的訪問方式,我們可以通過 http://192.168.200.133/frx/ 來訪問,但是如果地址后面不加斜杠,如 http://192.168.200.133/frx,頁面就會(huì)出問題。如果不加斜杠,Nginx 服務(wù)器內(nèi)部會(huì)自動(dòng)做一個(gè) 301 的重定向,重定向的地址會(huì)有一個(gè)指令叫 server_name_in_redirect 來決定重定向的地址:
- 如果該指令為 on重定向的地址為:http://server_name/目錄名/
- 如果該指令為 off重定向的地址為:http://原URL中的域名/目錄名/
所以就拿剛才的地址來說,訪問 http://192.168.200.133/frx 如果不加斜杠,那么按照上述規(guī)則:
- 如果指令 server_name_in_redirect 為 on,則 301 重定向地址變?yōu)?http://localhost/frx/,IP 發(fā)生改變,地址出現(xiàn)了問題
- 如果指令 server_name_in_redirect 為 off,則 301 重定向地址變?yōu)?http://192.168.200.133/frx/。這個(gè)符合我們的期望
注意 server_name_in_redirect 指令在 Nginx 的 0.8.48 版本之前默認(rèn)都是 on,之后改成了 off,所以現(xiàn)在我們這個(gè)版本不需要考慮這個(gè)問題,但是如果是 0.8.48 以前的版本并且 server_name_in_redirect 設(shè)置為 on,我們?nèi)绾瓮ㄟ^ Rewrite 來解決這個(gè)問題?
解決方案
我們可以使用 Rewrite 功能為末尾沒有斜杠的 URL 自動(dòng)添加一個(gè)斜杠
server { listen 80; server_name localhost; server_name_in_redirect on; location /frx { if (-d $request_filename){ # 如果請(qǐng)求的資源目錄存在 rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; # $2 獲取第二個(gè)括號(hào)的值:/ } } }
$1 是第一個(gè)括號(hào)的值,$2 是第二個(gè)括號(hào)的值。
三、proxy_pass
這里將發(fā)送 http://192.168.199.27/frx/xu 請(qǐng)求。
3.1 不增加目錄
案例 | localtion | proxy_pass | 匹配 |
---|---|---|---|
1 | /frx | http://192.168.199.27 | /frx/xu |
2 | /frx/ | http://192.168.199.27 | /frx/xu |
3 | /frx | http://192.168.199.27/ | //xu |
4 | /frx/ | http://192.168.199.27/ | /xu |
若proxy_pass 后加’/',代表去除掉請(qǐng)求和 location 的匹配的字符串
不加 ’ / ’ 則追加全部請(qǐng)求到地址后面。
3.2 增加目錄
案例 | localtion | proxy_pass | 匹配 |
---|---|---|---|
1 | /frx | http://192.168.199.27/bing | /bing/xu |
2 | /frx/ | http://192.168.199.27/bing | /bingxu |
3 | /frx | http://192.168.199.27/bing/ | /bing//xu |
4 | /frx/ | http://192.168.199.27/bing/ | /bing/xu |
簡(jiǎn)而言之,就是如果proxy_pass后面有目錄,有沒有’/',Nginx都會(huì)將匹配 location 的內(nèi)容從請(qǐng)求路徑中剔除,然后將請(qǐng)求路徑剩余的字符串拼接到 proxy_pass 后生成新的請(qǐng)求路徑。
舉例:proxy_pass 的 ip:port 后接了字符串,因此將 location 的 /frx/ 從原請(qǐng)求路徑 /frx/xu
中剔除,變?yōu)?xu,然后將 xu 拼接到 http://192.168.1.48/bing 后生成了新請(qǐng)求,因此其他地址收到的請(qǐng)求就是
/bingxu。
四、root和alias
這兩個(gè)指令都可以來指定訪問資源的路徑,那么這兩者之間的區(qū)別是什么?舉例說明
- 在
/usr/local/nginx/html
目錄下創(chuàng)建一個(gè) images 目錄,并在目錄下放入一張圖片mv.png
圖片。然后進(jìn)入配置文件,添加如下內(nèi)容:
location /images { root /usr/local/nginx/html; }
訪問圖片的路徑為:http://192.168.91.200/images/mv.png
如果是root,則請(qǐng)求為/usr/local/nginx/html/images/mv.png
location /images { alias /usr/local/nginx/html; }
如果是alias,再次訪問上述地址,頁面會(huì)出現(xiàn) 404 的錯(cuò)誤,查看錯(cuò)誤日志會(huì)發(fā)現(xiàn)是因?yàn)榈刂凡粚?duì),所以驗(yàn)證了:
- root 的處理結(jié)果是:root 路徑 + location 路徑,location 路徑包括匹配后面的請(qǐng)求,即包括 /mv.png
/usr/local/nginx/html/images/mv.png
- alias 的處理結(jié)果是:使用 alias 路徑替換 location 路徑
/usr/local/nginx/html/mv.png
需要在 alias 后面路徑改為:
location /images { alias /usr/local/nginx/html/images; }
如果 location 路徑是以 / 結(jié)尾,則 alias 也必須是以 / 結(jié)尾,root 沒有要求。
將上述配置修改為:
location /images/ { alias /usr/local/nginx/html/images; }
訪問就會(huì)出問題,查看錯(cuò)誤日志還是路徑不對(duì),所以需要把 alias 后面加上 /
location /images/ { alias /usr/local/nginx/html/images/; }
小結(jié):
- root 的處理結(jié)果是: root 路徑 + location 路徑
- alias 的處理結(jié)果是:使用 alias 路徑替換 location 路徑
- alias 是一個(gè)目錄別名的定義,root 則是最上層目錄的含義
- 如果 location 路徑是以 / 結(jié)尾,則 alias 也必須是以 / 結(jié)尾,root 沒有要求
- alias 不支持 location 的 =
五、實(shí)例
通過nginx訪問 127.0.0.1/api/test
- location和proxy_pass都不加’/’
location /api { proxy_pass http://127.0.0.1:8888; }
實(shí)際訪問地址為127.0.0.1:8888/api/test
- location加proxy_pass不加
location /api/ { proxy_pass http://127.0.0.1:8888; }
實(shí)際訪問地址為127.0.0.1:8888/api/test
- location和proxy_pass都加
location /api/ { proxy_pass http://127.0.0.1:8888/; }
實(shí)際訪問地址為127.0.0.1:8888/test
- location不加proxy_pass加
location /api { proxy_pass http://127.0.0.1:8888/; }
實(shí)際訪問地址為127.0.0.1:8888//test
總結(jié):只要是proxy_pass 端口后方加了斜杠的那么 location都會(huì)被替換不會(huì)加到實(shí)際訪問路徑中,包括( proxy_pass http://127.0.0.1:8888/xxx,其實(shí)就是有目錄的情況)也算。
到此這篇關(guān)于nginx中斜杠(‘/‘)的具體使用的文章就介紹到這了,更多相關(guān)nginx 斜杠內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx應(yīng)對(duì)Permission denied和File not found的配置
這篇文章主要介紹了Nginx應(yīng)對(duì)Permission denied和File not found的錯(cuò)誤配置,文中介紹了兩個(gè)PHP程序使用時(shí)出現(xiàn)相關(guān)問題后的解決案例,需要的朋友可以參考下2015-12-12keepalived+lvs 對(duì)nginx做負(fù)載均衡和高可用的操作方法
這篇文章主要介紹了keepalived+lvs 對(duì)nginx做負(fù)載均衡和高可用的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12