【譯】13個Nginx Location指令例子

nginx

如果你正在運行Nginx web服務(wù)器,對你來說序愚,明白location指令怎么工作的,是很重要的叔营。

對于進(jìn)來的URL,Nginx利用location指令決定基于前綴或正則來應(yīng)用哪些配置所宰。

比如绒尊,當(dāng)一個以*.gif*.png或任何其他圖片文件名擴(kuò)展,它應(yīng)該從哪些目錄來提供圖片文件仔粥。

在這個教程婴谱,我們將通過例子解釋如下內(nèi)容:

接下來是nginx配置文件location指令的語法

syntax:
location [modifier] match {

}

在上面的語法中:

  • Modifier是可選的
  • Match定義在URL 里什么應(yīng)該被匹配到來執(zhí)行配置,那些配置在這個特定的location塊中被提到
  • 當(dāng)沒有modifier時躯泰,match對進(jìn)來的URL僅僅執(zhí)行前綴匹配
  • 如果在modifier使用~~*谭羔,則match將是一個正則表達(dá)式

location塊的上下文是server。所以麦向,你將在server塊中看見如下的這些內(nèi)容口糕。

比如:

server {
    listen       80;
    server_name  thegeekstuff.com

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
    
    ..
    ..
}

你可以為您的網(wǎng)站設(shè)置任意數(shù)量的location指令。

如果你是 Nginx 新手磕蛇,你能通過 How to Install and Configure Nginx from Source on Linux 解釋的那樣,來安裝它十办。

默認(rèn)Location指令運行

如果你通過默認(rèn)配置已安裝Nginx秀撇,你能看到你的當(dāng)前location指令值,在如下的default.conf 里向族。

主要的配置文件是/etc/nginx/nginx.conf呵燕。

但是,serverlocation指令在default.conf里件相,default.conf位于/etc/nginx/conf.d/default.conf 再扭,default.conf如下所示。

# vi /etc/nginx/conf.d/default.conf
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

default.conf文件定義了如下的兩個location`指令

  • /針對默認(rèn)的location
  • /50x.html針對所有服務(wù)器錯誤

改變默認(rèn)的Nginx Root Location (即DocumentRoot)

接下來的例子展示夜矗,針對你的Nginx服務(wù)器泛范,你怎么改變默認(rèn)的DocumentRoot

location /下紊撕,通過在root里面定義的目錄罢荡,Nginx服務(wù)器將提供所有的文件。

比如对扶,如下將提供thegeekstuff.com/index.html 文件区赵,使用/var/www/html目錄峭梳,代替nginx默認(rèn)的root位置页徐。

# vi /etc/nginx/conf.d/default.conf
    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

/var/www/html下,為了這次測試媳危,我們創(chuàng)建示例文件络凿。

# cat /var/www/html/index.html 
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World! - New Nginx Root Location</h1>
</body>
</html>

注意:任何時候骡送,你修改了nginx配置文件昂羡,你應(yīng)該使用systemctlservice命令來重啟nginx

但是各谚,大多數(shù)場景紧憾,代替重啟它,如果你僅僅通過如下的reload配置昌渤,那是足夠好的赴穗。

# service nginx reload
Reloading nginx:   [  OK  ]

使用Location自定義404頁面

當(dāng)nginx遇到一個HTTP404錯誤碼時,通過location指令膀息,你也能配置應(yīng)提供的文件般眉,即,File Not Found

為了達(dá)到此目的潜支,在你的default.conf文件里甸赃,添加如下行。

# vi /etc/nginx/conf.d/default.conf

    error_page   404  /404.html;
    location = /404.html {
        root   /var/www/html/errors;
    }

在上面的例子中:

  • error_page–使用此指令來定義你想要捕獲什么類型的錯誤冗酿。我們在這里捕獲的是404錯誤埠对。 /404.html表示,當(dāng)404錯誤被捕獲裁替,它應(yīng)該展示/404.html頁面项玛。
  • location目錄表示,從/var/www/html/errors 目錄中弱判,提供這個/404.html文件
  • 緊跟location指令后的修飾符=表示襟沮,針對提供的配置,URL /404.html不得不精確地匹配昌腰】基本上,它表示這個配置僅針對404錯誤碼才是有效的

自從我們已自定義這個目錄位置遭商,創(chuàng)建錯誤目錄和如下所示的404.html文件

# mkdir -p /var/www/html/errors

# cat 404.html 
<html>
<head>
<title>404 - Where did it go?</title>
</head>
<body>
<h1>File Not Found: Don't worry. We'll find it for you. Please contact us.</h1>
</body>
</html>

使用Location自定義多個50x服務(wù)器錯誤

默認(rèn)固灵,你將看到像如下的已經(jīng)在default.conf文件中的一些事情。

在這個例子中劫流,我們修改50x.html 文件的位置怎虫,并且創(chuàng)建一個自定義頁面。

這里需要注意的一件重要事情是困介,你能跳轉(zhuǎn)多個HTTP錯誤碼到單個文件大审。如下所示,任何服務(wù)器端的錯誤碼(包括500座哩,501徒扶,503504)將跳轉(zhuǎn)到叫50x.html的一個錯誤文件。

在這個例子中根穷,我們創(chuàng)建了這個 50x.html文件姜骡,并且將它放到錯誤目錄里导坟。

        error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html/errors;
    }

下一步,在我們自定義的錯誤目錄里圈澈,創(chuàng)建50x.html文件

# cd /var/www/html/errors;

# vi 50x.html 
<html>
<head>
<title>50x - Server Error</title>
</head>
<body>
<h1>Something went wrong on the server side. Please contact our server admin.</h2>
</body>
</html>

從一個自定義的Location 提供你的網(wǎng)站圖片

針對location指令惫周,另外一個典型的應(yīng)用是指定location目錄,你想要提供所有你網(wǎng)站的圖片文件的目錄康栈。

在如下的例子中递递,任何時候,你調(diào)用一個包含/img緊跟著一個圖片文件名的url啥么,它將在/custom/images目錄里尋找這個圖片文件登舞。

        location /img/ {
        root /custom/images;
    }

針對這個例子,在這個目錄中悬荣,我們有如下的圖片文件:

# ls -1 /custom/images/img/
dog.gif
cat.gif
fish.png
parrot.jpg
..

所以菠秒,當(dāng)你調(diào)用thegeekstuff.com/img/cat.gif,它將從上面的目錄中提供cat.gif

如果你對負(fù)債均衡感興趣的話氯迂,你應(yīng)該在location指令里使用proxy_pass践叠,它在這里 How to Setup Nginx as loadbalancer for Apache or Tomcat for HTTP/HTTPS被解釋。

使用=(等于號)Location修飾符提取匹配

當(dāng)你想要匹配精準(zhǔn)的請求URI時嚼蚀,使用=(等于號)作為修飾符酵熙。

為了理解這個,首先驰坊,讓我們用接下來簡單的沒有等于號的配置。

    location /db {
        root   /data;
        ...
    }

如上所述哮独,它將匹配如下的URI拳芙。如下的所有都將起作用。

  • URL/db – 將在/data/db下尋找index.html 文件
  • URL/db/index.html – 將在/data/db下尋找index.html 文件
  • URL/db/connect/index.html – 將在/data/db/connect下尋找index.html 文件

但是皮璧,當(dāng)我們添加=(等于號)location修飾符舟扎,如下所示,上述行為將發(fā)生改變悴务。

    location = /db {
        root   /data;
    }

如上所述睹限,它將僅僅匹配如下的EXACT URL。其他不將起作用讯檐。

  • URL/db – 起作用
  • URL/db/index.html – 不起作用
  • URL/db/connect/index.html – 不起作用

重要提示:此外羡疗,在上面的例子中的示例中,root值不起作用别洪。這是因為/db將使用更早定義的root /位置叨恨。所以,當(dāng)你得到URL/db時挖垛,它將已經(jīng)提供 index.html文件痒钝,從/var/www/html/db/秉颗,而不是從你期望的/data/db/

所以送矩,當(dāng)你調(diào)用URL蚕甥,比如thegeekstuff.com/db,帶有=(等于號)的修飾符栋荸,將提供如下的文件菇怀。

# ls -l /var/www/html/db/index.html 
-rw-r--r--. 1 root root 13 May  8 17:28 /var/www/html/db/index.html

另外,請注意蒸其,當(dāng) Nginx 匹配具有 = 修飾符的特定location指令時敏释,將不會尋找任何進(jìn)一步的location指令。

一個流行的配置是針對你已經(jīng)存在的Apache/PHP 網(wǎng)站摸袁,安裝Nginx作為前端钥顽。為此,你應(yīng)該按照此處的說明使用反向代理:How to Setup Nginx Reverse Proxy to Apache/PHP on Linux

使用~(波浪號)進(jìn)行大小寫正則表達(dá)式匹配

當(dāng)你想要使用正則表達(dá)式匹配(代替前綴匹配)時靠汁,你應(yīng)該使用~(波浪號)蜂大。

使用~將執(zhí)行區(qū)分大小寫匹配。

接下來是一個特殊的例子蝶怔,為了匹配圖片URLs奶浦,使用~ location修飾符。

    location ~ .(png|gif|ico|jpg|jpeg)$ {

    }

在上面的例子中:

  • ~用于區(qū)分大小寫的正則表達(dá)式匹配修飾符
  • ( ) – 此正則表達(dá)式中的所有值都將被視為 URL 中的關(guān)鍵字
  • |這是 OR 運算符踢星。即澳叉,將考慮 URL 中的 png、gif沐悦、ico成洗、jpg 或 jpeg 關(guān)鍵字
  • 末尾的 $ 表示指定的關(guān)鍵字應(yīng)位于 URL 的末尾
  • 基本上,整個正則表達(dá)式適用于任何圖像 URL藏否。即任何以圖像文件結(jié)尾的 URL

假設(shè)我們在 images 目錄中有以下文件:

dog.gif
cat.gif
fish.png
parrot.jpg
..

在上面的例子中:

  • URL/img/dog.gif – 這將工作瓶殃,因為在我們的服務(wù)器上,我們有dog.gif
  • URL/img/CAT.GIF – 這將不工作副签,因為我們沒有大寫的CAT.GIF(在服務(wù)器端遥椿,我們僅有小寫的cat.gif)。因為我們使用~淆储,它將做區(qū)分大小寫匹配冠场,不將提供這個大寫的CAT.GIF文件

此外,除了指定兩個關(guān)鍵字 jpg 和 jpeg本砰,您還可以使"jpe?g"將它們組合起來慈鸠,如下所示

    location ~ .(png|gif|ico|jpe?g)$ {

    }

如果您想匹配 URL 中的 php 關(guān)鍵字(對于 php 網(wǎng)站)并對其進(jìn)行處理,請參閱此處的一些 Location 示例:How to Add Custom File Extension for PHP in Apache and Nginx

使用~*(波浪-星號)進(jìn)行不區(qū)分大小寫正則表達(dá)式匹配

這類似于上面的示例,但是這將執(zhí)行不區(qū)分大小寫的正則表達(dá)式匹配青团。

    location ~* .(png|gif|ico|jpg|jpe?g)$ {
        root /custom;
    }

在上面的例子中:

  • URL/img/dog.gif – 這將工作譬巫,因為在我們的服務(wù)器上,我們有dog.gif
  • URL/img/CAT.GIF – 這也將工作督笆,因為這將被視為不區(qū)分大小寫芦昔,nginx將從服務(wù)器提供cat.gif,盡管URL有大寫的CAT.GIF

^~最好非正則匹配(尖角-波浪號)

使用此修飾符時娃肿,匹配的 URL 將使用此配置咕缎。基本上料扰,此配置將用作前綴匹配凭豪,但即使有可用的,這也不會執(zhí)行任何進(jìn)一步的正則表達(dá)式匹配晒杈。

location ^~ /img/ {

}

Nginx Location關(guān)聯(lián)的錯誤消息

以下是一些與location相關(guān)的錯誤消息嫂伞,如果 location 指令有問題,您會在重新啟動 Nginx 時收到這些錯誤消息拯钻。

如果您有多個具有相同前綴匹配的location指令帖努,您將收到以下"duplicate location"錯誤消息:

# service nginx start
Starting nginx: nginx: [emerg] duplicate location "/" in /etc/nginx/conf.d/default.conf:45 [FAILED]

如果你在錯誤的上下文中使用location。即在server之外粪般,那么您將收到以下錯誤消息:

# service nginx restart
nginx: [emerg] "location" directive is not allowed here in /etc/nginx/nginx.conf:34
nginx: configuration file /etc/nginx/nginx.conf test failed

你只能使用 nginx 允許的location修飾符(例如 =)拼余。在下面的代碼片段中,我們使用 $ 作為 Nginx 不允許的location修飾符亩歹。

    location $ /ab {
        root   /var/www/html1;
        index  index.html index.htm;
    }

在這種情況下匙监,你將收到以下無效的location修飾符錯誤消息,如下所示小作。

# service nginx restart
nginx: [emerg] invalid location modifier "$" in /etc/nginx/conf.d/default.conf:17
nginx: configuration file /etc/nginx/nginx.conf test failed

Location修飾符概括

為了正確看待事情亭姥,下面列出了上面討論的大多數(shù)location示例:

以下 = 用于完全匹配。例如:thegeekstuff.com/

location = / {

}

以下沒有任何修飾符是 for / 后跟任何東西躲惰。例如:thegeekstuff.com/contact.html

location / {

}

以下是針對 /db 的。例如:thegeekstuff.com/db/index.html

location /db/ {

}

以下是沒有 Reg-Ex 的最佳前綴匹配变抽。例如:thegeekstuff.com/images/logo.gif

location ^~ /images/ {

}

以下是正則表達(dá)式匹配础拨。例如:thegeekstuff.com/db/mysql.jpg

location ~* .(png|gif|ico|jpg|jpeg)$ {

}

使用@自定義命名 Location

你還可以在 location 指令中使用 @(at 符號),如下例所示绍载。

關(guān)于這一點诡宗,需要注意以下幾點:

  • 使用 @ 定義命名location
  • location 配置為請求重定向。這不用于常規(guī)請求處理击儡。
  • 你不能嵌套 @ location 指令

下面是一個例子:

location / {
    try_files $uri $uri/ @custom;
}

location @custom {
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
}

在上面的例子中的例子中:

  • 首先塔沃,@custom 本身可以在任何其他location 塊中定義。如上例所示阳谍,這是在第一個location 塊中使用 try_files 定義的蛀柴。

  • 接下來螃概,location @custom指的是之前在任何其他location塊中定義的@custom 命名location。此自定義命名location用于上面的第二個location塊鸽疾。

  • 請注意吊洼,你可以隨意稱呼它而不是@custom。例如:@database制肮、@myapp冒窍、@complexredirect@misc豺鼻、@thegeekstuff

Nginx Location匹配處理順序和邏輯

以下是關(guān)于location匹配順序和邏輯需要考慮的幾件事:

  • 首先综液,即使在任何location匹配發(fā)生之前,傳入的 URI 也會被規(guī)范化儒飒。例如谬莹,首先它將解碼 URL 中的%XX
  • 它還會解析 URL 中適當(dāng)?shù)南鄬β窂浇M件,如果 URL 中有多個斜杠 /约素,它會將它們壓縮為單個斜杠等届良。只有在 URL 的初始規(guī)范化之后,location匹配才會發(fā)揮作用
  • 當(dāng)沒有location修飾符時圣猎,它只會被視為要在 URL 中匹配的前綴字符串
  • Nginx 將首先檢查使用前綴字符串定義的匹配location
  • 如果 URL 有多個location前綴字符串匹配士葫,那么 Nginx 將使用最長匹配的前綴location
  • 在前綴匹配之后,nginx 將按照它們在 nginx 配置文件中定義的順序檢查正則表達(dá)式location匹配
  • 因此送悔,在配置文件中定義正則表達(dá)式匹配的順序很重要慢显。 nginx 匹配正則表達(dá)式location配置的那一刻,它不會再查找任何內(nèi)容欠啤。因此荚藻,在配置頂部使用重要的關(guān)鍵正則表達(dá)式location匹配
  • 如果沒有找到正則表達(dá)式匹配location,那么 Nginx 將使用之前匹配的前綴location配置

原文鏈接 13 Nginx Location Directive Examples including Regular Expression Modifiers

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洁段,一起剝皮案震驚了整個濱河市应狱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祠丝,老刑警劉巖疾呻,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異写半,居然都是意外死亡岸蜗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門叠蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璃岳,“玉大人,你說我怎么就攤上這事×蹇叮” “怎么了单芜?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枚冗。 經(jīng)常有香客問我缓溅,道長,這世上最難降的妖魔是什么赁温? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任坛怪,我火速辦了婚禮,結(jié)果婚禮上股囊,老公的妹妹穿的比我還像新娘袜匿。我一直安慰自己,他們只是感情好稚疹,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布居灯。 她就那樣靜靜地躺著,像睡著了一般内狗。 火紅的嫁衣襯著肌膚如雪怪嫌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天柳沙,我揣著相機(jī)與錄音岩灭,去河邊找鬼。 笑死赂鲤,一個胖子當(dāng)著我的面吹牛噪径,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播数初,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼找爱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泡孩?” 一聲冷哼從身側(cè)響起车摄,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仑鸥,沒想到半個月后吮播,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡锈候,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年薄料,在試婚紗的時候發(fā)現(xiàn)自己被綠了敞贡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泵琳。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出获列,到底是詐尸還是另有隱情谷市,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布击孩,位于F島的核電站迫悠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巩梢。R本人自食惡果不足惜创泄,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望括蝠。 院中可真熱鬧鞠抑,春花似錦、人聲如沸忌警。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽法绵。三九已至箕速,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朋譬,已是汗流浹背盐茎。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留此熬,地道東北人庭呜。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像犀忱,于是被迫代替她去往敵國和親募谎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1,location指令 1)用在虛擬服務(wù)器server部分搀庶,提供來自客戶端URI或者內(nèi)部重定向訪問拐纱。當(dāng)一個請求匹...
    沐兮_d64c閱讀 3,851評論 0 4
  • 根據(jù)請求的URI設(shè)置配置集合。所有的匹配都是在解碼以后的哥倔,相鄰的兩個/會被翻譯成一個/秸架。 一個location規(guī)則...
    zzWinD閱讀 2,114評論 0 0
  • 默認(rèn)配置信息 可以發(fā)現(xiàn)配置文件由一下幾個部分組成: nginx的默認(rèn)主配置文件主要由main,events咆蒿,htt...
    wangsye閱讀 1,508評論 0 0
  • 指令作用 匹配指定的請求uri(請求uri不包含查詢字符串东抹,如http://localhost:8080/test...
    悠然望劍閱讀 39,339評論 4 24
  • 指令作用匹配指定的請求uri(請求uri不包含查詢字符串蚂子,如http://localhost:8080/test?...
    EmptyBottl_520d閱讀 357評論 0 0