在nginx中配置如何防止直接用ip訪問服務器web server及server_name特性講解

看了不少nginx的配置,好像都忽略了ip直接訪問web的問題,不利於SEO優化,因此咱們但願能夠避免直接用IP訪問網站,而是域名訪問,具體怎麼作呢,看下面。php

官方文檔中提供的方法:html

 If you do not want to process requests with undefined 「Host」 header lines, you may define a default server that just drops the requests:nginx

server {
listen 80 default_server;
server_name _;
return 444;
}

 

說白了就是隻要是ip訪問的直接重置444錯誤。web

可是這樣好像又不太友好,若是能直接給跳轉到該web server的網址就行了。正則表達式

配置以下:dom

 

server {
listen 80 default_server;
server_name _;
rewrite ^ http://www.domain.com$request_uri?;
}

 

這樣仍是有一點問題,某些特別的地址,我須要用ip訪問,其餘的都禁止,如何配置呢?優化

好比說我想讓監控寶直接用ip訪問個人機器的nginx狀態信息,其餘的用ip訪問的全部請求都跳轉到域名上。網站

 

server {
listen 80 default_server;
server_name _;
        location /xxxxx{
            stub_status on;
            access_log  off;
        }
        location /{
            rewrite ^ http://www.nginxs.com$request_uri?;
        }
}

這樣就實現了咱們想要的功能了。google

另外,在這裏說一下server_name。spa

server_name 是可使用正則表達式的,這個功能因該說至關實用。

Nginx中的server_name指令主要用於配置基於名稱的虛擬主機,server_name指令在接到請求後的匹配順序分別爲:

一、準確的server_name匹配,例如:

 

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

 

 

二、以*通配符開始的字符串:

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

三、以*通配符結束的字符串:

server {
     listen       80;
     server_name  www.*;
     ...
}

四、匹配正則表達式:

.+)\.\.com$;
     ...
}

nginx將按照1,2,3,4的順序對server name進行匹配,只有有一項匹配之後就會中止搜索,因此咱們在使用這個指令的時候必定要分清楚它的匹配順序(相似於location指令)。

server_name指令一項很實用的功能即是能夠在使用正則表達式的捕獲功能,這樣能夠儘可能精簡配置文件,畢竟太長的配置文件平常維護也很不方便。下面是2個具體的應用:

一、在一個server塊中配置多個站點:

server
   {
     listen       80;
     server_name  ~^(www\.)?(.+)$;
     index index.php index.html;
     root  /data/wwwsite/$2;
   }

站點的主目錄應該相似於這樣的結構:

/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com

 

這樣就能夠只使用一個server塊來完成多個站點的配置。

二、在一個server塊中爲一個站點配置多個二級域名。

實際網站目錄結構中咱們一般會爲站點的二級域名獨立建立一個目錄,一樣咱們可使用正則的捕獲來實如今一個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/;
   }

站點的目錄結構應該以下:

/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,這樣既解決了網站的主目錄訪問,又能夠增長seo中對www.domain.com的域名權重。

相關文章
相關標籤/搜索