關(guān)于Nginx的server_name和default_server

轉(zhuǎn)載【http://onlyzq.blog.51cto.com/1228/535279
轉(zhuǎn)載【https://www.oschina.net/question/12_3565

Nginx中的server_name指令主要用于配置基于名稱的虛擬主機,server_name指令在接到請求后的匹配順序分別為:
1、準確的server_name匹配,例如:

server {
listen 80;
server_name domain.com www.domain.com;
...
}

2、以通配符開始的字符串:
server {
listen 80;
server_name .domain.com;
...
}
3、以
通配符結(jié)束的字符串:
server {
listen 80;
server_name www.
;
...
}
4、匹配正則表達式:
server {
listen 80;
server_name ~^(?.+).domain.com$;
...
}

nginx將按照1,2,3,4的順序?qū)erver name進行匹配,只有有一項匹配以后就會停止搜索,所以我們在使用這個指令的時候一定要分清楚它的匹配順序(類似于location指令)。
server_name指令一項很實用的功能便是可以在使用正則表達式的捕獲功能,這樣可以盡量精簡配置文件,畢竟太長的配置文件日常維護也很不方便。下面是2個具體的應(yīng)用:
1、在一個server塊中配置多個站點:
server
{
listen 80;
server_name ~^(www.)?(.+)$;
index index.php index.html;
root /data/wwwsite/$2;
}
站點的主目錄應(yīng)該類似于這樣的結(jié)構(gòu):
/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com

這樣就可以只使用一個server塊來完成多個站點的配置。
2、在一個server塊中為一個站點配置多個二級域名。
實際網(wǎng)站目錄結(jié)構(gòu)中我們通常會為站點的二級域名獨立創(chuàng)建一個目錄,同樣我們可以使用正則的捕獲來實現(xiàn)在一個server塊中配置多個二級域名:

server
{
listen 80;
server_name ~^(.+)?.domain.com$;
index index.html;
if ($host = domain.com){
rewrite ^ http://www.domain.com permanent;
}
root /data/wwwsite/domain.com/$1/;
}
站點的目錄結(jié)構(gòu)應(yīng)該如下:
/data/wwwsite/domain.com/www/
/data/wwwsite/domain
.com/nginx/
這樣訪問www.domain.com時root目錄為/data/wwwsite/domain.com/www/,nginx.domain.com時為/data/wwwsite/domain.com/nginx/,以此類推。

后面if語句的作用是將domain.com的方位重定向到www.domain.com,這樣既解決了網(wǎng)站的主目錄訪問,又可以增加seo中對www.domain.com的域名權(quán)重。

Nginx 的 default_server 指令

server {
listen 80 default_server;
server_name oschina.net www.oschina.net;
...
}
先看看上面這段配置,listen 指令后面有一個參數(shù) default_server ,這個參數(shù)是在 0.8.21 版本以后才有的,而之前是 default 指令。
Nginx 的虛擬主機是通過HTTP請求中的Host值來找到對應(yīng)的虛擬主機配置,如果找不到呢?那 Nginx 就會將請求送到指定了 default_server 的 節(jié)點來處理,如果沒有指定為 default_server 的話,就跑到 localhost 的節(jié)點,如果沒有 localhost 的節(jié)點,那只好 404 了。
另外你也可以指定對于沒有匹配的 Host 值時,返回錯誤到客戶端,這在現(xiàn)在國內(nèi)用來處理未備案域名指向自己時非常有用,看看下面的配置:
server {
listen 80 default_server;
server_name _;
return 444;
}
通過返回444這個Nginx的非標準錯誤碼來讓Nginx斷開與瀏覽器之間的連接。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 配置運行Nginx服務(wù)器用戶(組) 用于配置運行Nginx服務(wù)器用戶(組)的指令是user,其語法格式為: use...
    吃瓜的東閱讀 4,669評論 0 41
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務(wù)都無法達到并發(fā)響應(yīng)量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,205評論 0 9
  • 1.ngnix介紹 ngnix www服務(wù)軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件...
    逗比punk閱讀 2,231評論 1 6
  • 閱讀之前,建議先閱讀初識 Nginx。 之后,我們來了解一下 Nginx 配置。 抽象來說,將 Nginx 配置為...
    思夢PHP閱讀 1,394評論 2 10

友情鏈接更多精彩內(nèi)容