首頁  >  文章  >  運維  >  Nginx伺服器中的location怎麼配置

Nginx伺服器中的location怎麼配置

WBOY
WBOY轉載
2023-05-14 19:16:123561瀏覽

語法
location  [=|~|~*|^~] /uri/  {...}

規則
##= : 表示精確的uri匹配(有興趣的同學可以看一下url和uri的區別)
~: 表示區分大小寫的正則匹配
~*:表示不區分大小寫的正則匹配
! ~ && !~*:表示區分大小寫不匹配的正則和不區分大小寫的不匹配的正則
/:通用匹配,任何請求都會匹配到

location匹配目標
location匹配測試只使用請求uri的部分,而不使用參數部分。 (原因:參數的寫法太多,無法精確匹配)

location匹配順序
多個location配置的前提下,location的匹配順序(未驗證,嘿嘿,google上搜的)
1.首先匹配=
2.其次匹配^~
3.其次按照配置文件的順序進行正則匹配、
4.最後是交給/進行通用匹配
注意:
當有匹配成功時,立刻停止匹配,按照當前匹配規則處理請求

演示實例

nginx 配置文件,自下到上分為三種層次分明的結構:

 |    http block        the protocol level
 |    server block       允許使用者定義location block ,並指定一個匹配模式(pattern)符合特定的uri。除了簡單的字串(例如檔案系統路徑),還允許使用更為複雜的匹配模式(pattern)。
location block 的基本語法形式是:

  location [=|~|~*|^~|@] pattern { ... }

[=|~|~*|^~|@] 被稱為location modifier ,這會定義nginx 如何去匹配其後的pattern ,以及該pattern 的最基本的屬性(簡單字串或正規表示式)。

關於location modifier

1. =

##這會完全符合指定的pattern ,而這裡的pattern 被限制成簡單的字串,也就是說這裡不能使用正規表示式。

example:

server {
  server_name jb51.net;
  location = /abcd {
  […]
  }
}

符合狀況:

    http://jb51.net/abcd        # 剛好完全符合
    http://jb51.net/abcd  # 剛好完全符合
    http://jb51.net/abcd   server 的系統本身對大小寫不敏感,例如windows ,那麼也符合

    http://jb51.net/abcd?param1?m2    # 忽略查詢串參數(query string arguments),這裡就是/abcd 後面的? param1?m2

    http://jb51.net/abcd/    # 不匹配,因為末端有反斜線(trailing slash),nginx 不認為這種情況是完全匹配
    http://jb51.net /abcde    # 不匹配,因為不是完全匹配


2. (none)

可以不寫location modifier ,nginx 仍然能去匹配pattern 。在這種情況下,符合那些以指定的 patern 開頭的 uri,注意這裡的 uri 只能是普通字串,不能使用正規表示式。

example:

server {
  server_name website.com;
  location /abcd {
  […]
  }
}
符合狀況:
    http://jb51.net/abcd        # 剛好完全符合
    http://jb51.net/abcd  # 剛好完全符合

    http://jb51.net/abcd   server 的系統本身對大小寫不敏感,例如windows ,那麼也符合

    http://jb51.net/abcd?param1?m2    # 忽略查詢串參數(query string arguments),這裡就是/abcd 後面的? param1?m2
    http://jb51.net/abcd/    # 末端存在反斜線(trailing slash)也屬於配對範圍內
    http://jb51.net/abcde    ##    http://jb51.net/abcde    ## 仍然匹配,因為uri 是以pattern 開頭的


3. ~

這個location modifier 對大小寫敏感,且pattern 須是正規表示式

example:
server {
  server_name jb51.net;
  location ~ ^/abcd$ {
  […]
  }
}
符合情況:
    http://jb51.net/abcd        # 完全符合

    http://jb51.net/abcd        # ?param1?m2    # 忽略查詢串參數(query string arguments),這裡是/abcd 後面的?param1?m2

    http://jb51.net/abcd/    # 不匹配,因為反斜線存在反斜線(trailing末尾存在反斜線(trailing末尾slash),不符合正規表示式^/abcd$
    http://jb51.net/abcde    # 不符合正規表示式^/abcd$
#注意:對於某些對大小寫不敏感的系統,例如windows ,~ 和~* 都是不起作用的,這主要是作業系統的原因。

4. ~*
与 ~ 类似,但这个 location modifier 不区分大小写,pattern 须是正则表达式
example:

server {
  server_name website.com;
  location ~* ^/abcd$ {
  […]
  }
}

匹配情况:
    http://jb51.net/abcd        # 完全匹配
    http://jb51.net/abcd        # 匹配,这就是它不区分大小写的特性
    http://jb51.net/abcd?param1?m2    # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1?m2
    http://jb51.net/abcd/    # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$
    http://jb51.net/abcde    # 不匹配正则表达式 ^/abcd$

5. ^~
匹配情况类似 2. (none) 的情况,以指定匹配模式开头的 uri 被匹配,不同的是,一旦匹配成功,那么 nginx 就停止去寻找其他的 location 块进行匹配了(与 location 匹配顺序有关)

6. @
用于定义一个 location 块,且该块不能被外部 client 所访问,只能被 nginx 内部配置指令所访问,比如 try_files or error_page

演示实例

Nginx伺服器中的location怎麼配置

产生的效果如下:
访问根目录/,匹配到location /
访问除hello.php之外的其它php程序,匹配到location ~ \.php$,并且用php5-fpm去运行
访问hello.php,匹配到location = /hello.php,访问被重定向到好联系官网

以上是Nginx伺服器中的location怎麼配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除