看了很多nginx的配置,好像都忽略了ip直接訪問web的問題,不利於SEO優化,所以我們希望可以避免直接用IP訪問網站,而是域名訪問,具體怎么做呢,看下面。
官方文檔中提供的方法:
If you do not want to process requests with undefined “Host” header lines, you may define a default server that just drops the requests:
server { listen 80 default_server; server_name _; return 444; }
說白了就是只要是ip訪問的直接重置444錯誤。
但是這樣好像又不太友好,如果能直接給跳轉到該web server的網址就好了。
配置如下:
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?; } }
這樣就實現了我們想要的功能了。
另外,在這里說一下server_name。
server_name 是可以使用正則表達式的,這個功能因該說相當實用。
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、以*通配符結束的字符串:
server { listen 80; server_name www.*; ... }
4、匹配正則表達式:
server { listen 80; server_name ~^(?.+)\.domain\.com$;
... }
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塊來完成多個站點的配置。
2、在一個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的域名權重。