7

需求

本周潘老师提出了一个需求:学生上传文件(html,js,css……)后,能够以学号加域名,如:123456.example.com的方式直接查看作业效果。

一看这不就类似github pages,在以前的时候还搞过一个github pages的博客,也是好久没用过了,
扯远了,回到正题,github是如何实现的,我并不知道,但以潘老师的需求来看,nginx肯定能实现的,经过查询后发现,nginx里面的很多参数都是支持正则表达式的,其中和域名有关的server_name也是支持的,并且学号是六位数字,格式也很好,问题的突破点就是他了。

server_name

nginx中的server_name指令主要用于配置基于名称的虚拟主机,所谓虚拟主机:

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供 www 服务,这样就可以实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的。

简单的说就是让一台服务器,提供多个不同的web服务。

server_name可以由精确名称通配符名称正则表达式来定义。
更多的基础知识可以看这篇文章,我们直接看正则表达式的使用。

解决方案

我们要匹配的是六位的数字,所以我们的正则表达式是:^(\d{6})\.example\.com$
解释一下这个正则表达式:

  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,和正则表达式 可以看看参考文章中的文章,都是写的很不错的。

最后

祝黄庭祥考研顺利。

参考文章

JS正则表达式完整教程(略长)
Nginx深入使用-服务器名称(server_name)规则
Nginx 虚拟主机


笙歌会停
1k 声望45 粉丝

代码成就万世基积沙镇海 梦想永在凌云意意气风发