一、 泛域名的解析與使用基礎
-
域名的泛域名解析
- 作用:可以讓域名支持無限的子域名(這也是泛域名解析最大的用途)。
- 泛域名可以用根域名,也可以用二級域名
- 泛域名解析,需要一台有獨立IP的服務器
- 根域名的泛域名解析,添加*的A記錄, 例如:*.domain.com
- 二級域名的泛域名解析, 添加.二級名稱,例如:.test.domain.com
-
nginx可以直接做泛域名解析
- 直接設置serever中的server_name
server { listen 80; server_name *.edu.qumogu.com location / { root /data/www/test/; index index index.html; }
- 任何一個aaa.test.domain.com都可以訪問
- 直接設置serever中的server_name
二、 泛域名也有規則,比如字符的長度,字符的規則,如何設置規則呢?
-
需要使用nginx的正則
- ^: 匹配字符串的開始位置;
- $:匹配字符串的結束位置;
- .和: .匹配任意字符,匹配數量0到正無窮;
- \ 將后面接着的字符標記為一個特殊字符或者一個原義字符或一個向后引用, 例如,. 斜杠用來轉義,.匹配 . ;
- (值1|值2|值3|值4):或匹配模式,例:(jpg|gif|png|bmp)匹配jpg或gif或png或bmp
- i不區分大小寫
- *~ 為區分大小寫匹配
- ~* 為不區分大小寫匹配
- !和!*分別為區分大小寫不匹配及不區分大小寫不匹配
- (pattern) 匹配括號內的pattern
-
- 匹配前面字符串一次或者多次
- nginx是支持[a-zA-Z]和{n,m}的,但是{}與conf的沖突,所以,匹配規則一定要用""包含起來
-
需要使用nginx的判斷if
# 示例一 if ($host !~* "^[a-zA-Z0-9_]{3,10}\.test\.domain\.com$") { return 444; } # 示例二 if ($host ~* ^newhouse\.(.+)?\.house365\.com) { set $host_city $1; rewrite ^(.*)$ http://$host_city.house365.com$1 permanent; }
-
需要使用nginx的變量,例如,下面的泛域名解析
server_name ~^(?<subdomain>.+)\.test\.domain\.com$; if ($subdomain !~* "^[a-zA-Z0-9]{3,10}$") { return 444; }
-
需要使用nginx的return
- 可以直接通過return code 來返回http的狀態碼
三、為泛域名解析設置正則判斷的方法
- 不設置severname 直接判斷$host
server { listen 80; if ($host !~* "^[a-zA-Z0-9_]{3,10}\.test\.domain\.com$") { return 444; } location / { root /data/www/test/; index index index.html; } }
- 設置server_name取出變化的部分,再判斷
server { listen 80; server_name ~^(?<subdomain>.+)\.test\.domain\.com$; if ($subdomain !~* "^[a-zA-Z0-9]{3,10}$") { return 444; } location / { root /data/www/test/; index index index.html; } }
四、nginx的正則使用的總結
- 字符長度判斷{n,m} 需要給整個規則加上""
實現1的時候,因為沒有看過網上有加雙引號的案例,所以不敢加 $host !~* ^[a-zA-Z0-9_]{3,10}\.test\.domain\.com$ 一直報錯,一度懷疑nginx是否支持長度的判斷
- 在severname中一直無法,實現直接判斷長度,所以才有2的變種實現
server_name ~ "^[a-zA-Z0-9_]{3,6}\.test\.domain\.com$";一直報server_name不是以;為結束的錯誤