語法
location [=|~|~*|^~] /uri/ {...}
規則
##= : 表示精確的uri匹配(有興趣的同學可以看一下url和uri的區別)~: 表示區分大小寫的正則匹配
~*:表示不區分大小寫的正則匹配
! ~ && !~*:表示區分大小寫不匹配的正則和不區分大小寫的不匹配的正則
/:通用匹配,任何請求都會匹配到
location匹配目標
location匹配測試只使用請求uri的部分,而不使用參數部分。 (原因:參數的寫法太多,無法精確匹配)
location匹配順序
多個location配置的前提下,location的匹配順序(未驗證,嘿嘿,google上搜的)1.首先匹配=
2.其次匹配^~
3.其次按照配置文件的順序進行正則匹配、
4.最後是交給/進行通用匹配
注意:
當有匹配成功時,立刻停止匹配,按照當前匹配規則處理請求
| http block the protocol level
| server block 允許使用者定義location block ,並指定一個匹配模式(pattern)符合特定的uri。除了簡單的字串(例如檔案系統路徑),還允許使用更為複雜的匹配模式(pattern)。
location block 的基本語法形式是:
location [=|~|~*|^~|@] pattern { ... }
[=|~|~*|^~|@] 被稱為location modifier ,這會定義nginx 如何去匹配其後的pattern ,以及該pattern 的最基本的屬性(簡單字串或正規表示式)。
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/ # 不匹配,因為末端有反斜線(trailing slash),nginx 不認為這種情況是完全匹配
http://jb51.net /abcde # 不匹配,因為不是完全匹配
2. (none)
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)也屬於配對範圍內
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/ # 不匹配,因為反斜線存在反斜線(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
演示实例
产生的效果如下:
访问根目录/,匹配到location /
访问除hello.php之外的其它php程序,匹配到location ~ \.php$,并且用php5-fpm去运行
访问hello.php,匹配到location = /hello.php,访问被重定向到好联系官网
以上是Nginx伺服器中的location怎麼配置的詳細內容。更多資訊請關注PHP中文網其他相關文章!