像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 虚拟主机

相关文章
相关标签/搜索