像github paegs同樣,給每一個用戶一個域名

需求

本週潘老師提出了一個需求:學生上傳文件(html,js,css……)後,可以以學號加域名,如:123456.example.com的方式直接查看做業效果。css

一看這不就相似github pages,在之前的時候還搞過一個github pages的博客,也是很久沒用過了,
扯遠了,回到正題,github是如何實現的,我並不知道,但以潘老師的需求來看,nginx確定能實現的,通過查詢後發現,nginx裏面的不少參數都是支持正則表達式的,其中和域名有關的server_name也是支持的,而且學號是六位數字,格式也很好,問題的突破點就是他了。html

server_name

nginx中的server_name指令主要用於配置基於名稱的虛擬主機,所謂虛擬主機:nginx

虛擬主機是一種特殊的軟硬件技術,它能夠將網絡上的每一臺計算機分紅多個虛擬主機,每一個虛擬主機能夠獨立對外提供 www 服務,這樣就能夠實現一臺主機對外提供多個 web 服務,每一個虛擬主機之間是獨立的,互不影響的。

簡單的說就是讓一臺服務器,提供多個不一樣的web服務。git

server_name能夠由精確名稱通配符名稱正則表達式來定義。
更多的基礎知識能夠看這篇文章,咱們直接看正則表達式的使用。github

解決方案

咱們要匹配的是六位的數字,因此咱們的正則表達式是:^(\d{6})\.example\.com$
解釋一下這個正則表達式:web

  1. ^ 在此表明開頭,$表明結尾。
  2. \d就是[0-9]。表示是一位數字。記憶方式:其英文是digit(數字)。
  3. {m, n}表明長度不小於m,不大於n,{n}表明長度爲n。
  4. . 是特殊字符,因此須要用\轉義。
  5. () 表明分組,這個一句話說不清楚,大概就是取括號內的值爲一個變量在nginx能夠經過$1,$2……取得。

在nginx中使用正則表達式要注意如下幾點:正則表達式

  1. 用正則表達式,服務器名稱必須以波浪號字符開頭。
  2. 忘記設置^$。在語法上它們不是必需的,但在邏輯上是必需的。
  3. 正則表達式中包含{}字符時應使用引號括起來

本需求中,nginx的配置爲:服務器

server {
   listen 8011;
   # 經過正則表達式匹配域名
   server_name  "~^(\d{6})\.example\.com$";
   # $1 是匹配到的第一個符合要求的變量
   root  ……/$1;
}

這只是針對這個需求的簡單實現,若是想要系統深刻的學習一下,server_name,和正則表達式 能夠看看參考文章中的文章,都是寫的很不錯的。網絡

最後

祝黃庭祥考研順利。post

參考文章

JS正則表達式完整教程(略長)
Nginx深刻使用-服務器名稱(server_name)規則
Nginx 虛擬主機

相關文章
相關標籤/搜索