nginx中的location指令

1、location 介紹

location是Nginx中的塊級指令(block directive),location指令的功能是用來匹配不同的url請求,進而對請求做不同的處理和響應,這其中較難理解的是多個location的匹配順序,本文會作為重點來解釋和說明。

開始之前先明確一些約定,我們輸入的網址叫做請求URI,nginx用請求URI與location中配置的URI做匹配。

2、localtion 語法

location有兩種匹配規則:

  • 匹配URL類型,有四種參數可選,當然也可以不帶參數。

    location [ = | ~ | ~* | ^~ ] uri { … }

  • 命名location,用@標識,類似于定于goto語句塊。

    location @name { … }

location匹配參數解釋:

(1)?“=”?,精確匹配

  • 內容要同表達式完全一致才匹配成功

location = /abc/ {.....}# 只匹配http://abc.com/abc
#http://abc.com/abc [匹配成功]
#http://abc.com/abc/index [匹配失敗]

(2)?“~”,執行正則匹配,區分大小寫。

location ~ /Abc/ {.....
}
#http://abc.com/Abc/ [匹配成功]
#http://abc.com/abc/ [匹配失敗]

(3)“~*”,執行正則匹配,忽略大小寫

location ~* /Abc/ {.....
}
# 則會忽略 uri 部分的大小寫
#http://abc.com/Abc/ [匹配成功]
#http://abc.com/abc/ [匹配成功]

(4)“^~”,表示普通字符串匹配上以后不再進行正則匹配。

location ^~ /index/ {.....
}
#以 /index/ 開頭的請求,都會匹配上
#http://abc.com/index/index.page  [匹配成功]
#http://abc.com/error/error.page [匹配失敗]

(5)不加任何規則

  • 不加任何規則時,默認是大小寫敏感,前綴匹配,相當于加了“~”與“^~”

location /index/ {......
}
#http://abc.com/index  [匹配成功]
#http://abc.com/index/index.page  [匹配成功]
#http://abc.com/test/index  [匹配失敗]
#http://abc.com/Index  [匹配失敗]
# 匹配到所有uri

(6)“@”,nginx內部跳轉

location /index/ {error_page 404 @index_error;
}
location @index_error {.....
}
#以 /index/ 開頭的請求,如果鏈接的狀態為 404。則會匹配到 @index_error 這條規則上。

3、location匹配順序

=?>?^~?>?~ | ~*?>?最長前綴匹配?>?/

序號越小優先級越高

  1. location = ? ?# 精準匹配

  2. location ^~ ? # 帶參前綴匹配

  3. location ~ ? ?# 正則匹配(區分大小寫)

  4. location ~* ? # 正則匹配(不區分大小寫)

  5. location /a ? # 普通前綴匹配,優先級低于帶參數前綴匹配。

  6. location / ? ?# 任何沒有匹配成功的,都會匹配這里處理

舉例

location = /  {
#規則A
}location = /login {
#規則B
}location ^~ /static/ {
#規則C
}location ~ \.(gif|jpg|png|js|css)$ {
#規則D
}location ~* \.png$ {
#規則E
}location !~ \.xhtml$ {
#規則F
}location !~* \.xhtml$ {
#規則G
}location / {
#規則H
}

匹配結果:

訪問根目錄/, 比如http://localhost/ 將匹配規則A訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H訪問 http://localhost/static/a.html 將匹配規則C訪問 http://localhost/b.jpg 將匹配規則D和規則E,但是規則D順序優先,規則E不起作用, 而 http://localhost/static/c.png 則優先匹配到 規則C訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,因為規則E不區分大小寫。訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,因為不區分大小寫。規則F,規則G屬于排除法,符合匹配規則但是不會匹配到。訪問 http://localhost/qll/id/1111 則最終匹配到規則H,因為以上規則都不匹配。

4、location URI結尾帶不帶 /

  1. 如果 URI 結構是 https://domain.com/ 的形式,尾部有沒有 / 都不會造成重定向。因為瀏覽器在發起請求的時候,默認加上了 / 。雖然很多瀏覽器在地址欄里也不會顯示 / 。這一點,可以訪問百度驗證一下。

  2. 如果 URI 的結構是 https://domain.com/some-dir/ 。尾部如果缺少 / 將導致重定向。因為約定,URL 尾部的 / 表示目錄,沒有 / 表示文件。所以訪問 /some-dir/ 時,服務器會自動去該目錄下找對應的默認文件。如果訪問 /some-dir 的話,服務器會先去找 some-dir 文件,找不到的話會將 some-dir 當成目錄,重定向到 /some-dir/ ,去該目錄下找默認文件。

舉個例子:

server {listen       9001;server_name  www.abc.com;location ~ /edu {proxy_pass http://127.0.0.1:8080;}}

我們訪問www.abc.com:9001/edu,看下效果

圖片

訪問 /edu 時,服務器首先去找edu文件,找不到則將edu當做目錄,重定向到 /edu/,在該目錄下找默認文件。

但是如果想這兩種請求對應不同的處理,就要明確增加不帶/結尾的location配置。例如:

location  /doc {proxy_pass http://www.doc123.com
}
location  /doc/ {proxy_pass http://www.doc456.com
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535414.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

容器底層實現技術Namespace/Cgroup

Docker容器實現原理 Docker容器在實現上是通過namespace技術來進行進程隔離,通過cgroup技術實現容器進程可用資源的限制,當docker啟動一個容器時,實際是創建了多了namespace參數的進程。 Namespace Namespace:命名空間 作用&#…

身體原因 斷更一周

由于眾所周知的原因,博主最近具有發熱、全身乏力、酸痛、干咳等癥狀,已嚴重影響日常的工作學習和博客編寫,所以斷更我將一周,由下周三(即2022年12月21日)恢復更新 更多往期內容可以參考:全網最…

異方差與多重共線性對回歸問題的影響

異方差的檢驗 1.異方差的畫圖觀察 2.異方差的假設檢驗,假設檢驗有兩種,一般用懷特檢驗使用方法在ppt中,課程中也有實驗,是一段代碼。 異方差的解決辦法 多重共線性 多重共線性可能帶來的影響: 多重共線性的檢驗 多重…

如何修改Docker的鏡像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的國內鏡像源鏡像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重啟Docker服務 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

nginx 的 rewrite 模塊

ngxhttprewrite_module 模塊用來使用正則表達式(PCRE)改變請求的 URI,返回重定向,并有條件地選擇配置。 指令執行順序 首先順序執行 server 塊中的 rewrite 模塊指令,得到 rewrite 后的請求 URI 然后循環執行如下指令…

所有的Python庫

庫名稱簡介 Chardet字符編碼探測器,可以自動檢測文本、網頁、xml的編碼。 colorama主要用來給文本添加各種顏色,并且非常簡單易用。 Prettytable主要用于在終端或瀏覽器端構建格式化的輸出。 difflib,[Python]標準庫,計算文本…

Oracle行轉列語法總結大全

一、decode語法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各種符號 之 含義

#!&#xff1a;符號能夠被內核識別成是一個腳本的開始&#xff0c;這一行必須位于腳本的首行 $0&#xff1a;當前腳本的名字 $#&#xff1a;輸入<調用>參數(腳本或函數的位置參數) 的個數&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…

Nginx的11個執行流程

1 Nginx簡介 Web服務器市場份額 Nginx [engine x] 最初由 Lgor Sysoev 編寫。根據 Netcraft 的數據&#xff0c;到2020年9月&#xff0c;Nginx 服務或代理了25.76&#xff05;站點&#xff0c;市場份額占到了約34.03&#xff05;。 Nginx 被廣泛用作&#xff1a; HTTP服務器…

Nginx的執行階段詳解

在了解nginx的執行階段前&#xff0c;先看一個例子 對echo不熟悉的&#xff0c;可以先看文章Nginx調試必備了解下echo擴展 回到上面這個例子&#xff0c;在server塊中配置這樣的location&#xff0c;你覺得輸出是什么樣子&#xff1f; 按照正常的邏輯&#xff0c;輸出應該是32 …

Docker掛了,數據如何找回

docker在實際使用中&#xff0c;讓運維人員詬病的&#xff0c;除了安全問題外&#xff0c;大概就是數據的問題了 很多人在初用docker的時候&#xff0c;很多時候都忘記或不知道docker中需要保留的數據需要掛載到宿主機文件夾到容器內部對應目錄&#xff08;當然除了掛載宿主機目…

TCP總結

TCP這些東西&#xff0c;基本每個程序猿都或多或少是掌握的了。雖然感覺在實際開發中沒有什么用武之處&#xff0c;但&#xff0c;面試他要問啊 而最近大家伙過完年&#xff0c;也都在準備春招&#xff0c;我也一樣。閱讀了一些okHttp源碼之后&#xff0c;又屁顛屁顛地跑回來重…

Shell 中各種括號的作用

一、小括號&#xff0c;圓括號&#xff08;&#xff09; 1、單小括號 () ①命令組。括號中的命令將會新開一個子shell順序執行&#xff0c;所以括號中的變量不能夠被腳本余下的部分使用。括號中多個命令之間用分號隔開&#xff0c;最后一個命令可以沒有分號&#xff0c;各命令和…

linux基線核查腳本

#!/bin/bash #version 2.0cat <<EOF ************************************************************************************* ***** linux基線檢查腳本 ***** ************************************************************************************* *…

LDAP命令介紹---dsreplication

可以使用此實用程序來配置服務器之間的復制, 以使服務器數據保持同步。要正確進行復制, 必須先使用 enable 子命令啟用復制, 然后再使用 initialize 子命令將一個服務器的內容初始化為另一個服務器的內容用法: dsreplication {子命令} {選項}可用子命令:disable對指定服務器中…

LDAP命令介紹---dsconfig

此實用程序可用于定義目錄服務器的基本配置 用法: dsconfig {子命令} {選項} 獲取子命令用法列表: --help-distribution 顯示與 分發 相關的子命令 --help-general-configuration 顯示與 一般配置 相關的子命令 --help-integration 顯示與 集成 相關的子命令 --…

LDAP命令介紹---dsconfig子命令----help-distribution顯示與分發相關的子命令

此實用程序可用于定義目錄服務器的基本配置用法: dsconfig {子命令} {選項}可用子命令:create-distribution-algorithm創建分發算法create-distribution-partition創建分發分區create-workflow-element --type distribution創建分發工作流元素create-global-index創建全局索引…

LDAP命令介紹---ldappasswordmodify口令修改操作

此實用程序可用于在目錄服務器中執行 LDAP 口令修改操作用法: ldappasswordmodify {選項}其中 {選項} 包括:-a, --authzID {authzID}應更改口令的用戶條目的授權 ID -A, --provideDNForAuthzID將綁定 DN 用作口令修改操作的授權 ID -n, --newPassword {newPassword}為目標用戶…

LDAP命令介紹---dstune

此實用程序可用于幫助您優化 OUD 目錄服務器。 您可以選擇自動或基于其他標準 (例如, 內存限制或服務器將包含的數據) 優化服務器用法: dstune {子命令} {選項}可用子命令:data-based使用描述目錄服務器將包含的數據的信息優化服務器。使用 --ldifFile 可基于 LDIF 文件的內容…

LDAP命令介紹---dsreplication--initialize

initialize 將目標服務器中指定基礎 DN 下的數據內容初始化為源服務器的內容。要正確進行復制, 在啟用復制后必須執行該操作 (也可以使用 initialize-all 達到該目的) initialize-all 對于正在復制其內容的所有服務器, 將它們指定基礎 DN 下的數據內容初始化為指定…