需求
本周潘老师提出了一个需求:学生上传文件(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$
。
解释一下这个正则表达式:
^
在此代表开头,$
代表结尾。\d
就是[0-9]
。表示是一位数字。记忆方式:其英文是digit(数字)。{m, n}
代表长度不小于m,不大于n,{n}
代表长度为n。.
是特殊字符,所以需要用\
转义。()
代表分组,这个一句话说不清楚,大概就是取括号内的值为一个变量在nginx
可以通过$1,$2……
取得。
在nginx中使用正则表达式要注意以下几点:
- 用正则表达式,服务器名称必须以波浪号字符开头。
- 忘记设置
^
和$
锚。在语法上它们不是必需的,但在逻辑上是必需的。- 正则表达式中包含
{
和}
字符时应使用引号括起来
本需求中,nginx的配置为:
server {
listen 8011;
# 通过正则表达式匹配域名
server_name "~^(\d{6})\.example\.com$";
# $1 是匹配到的第一个符合要求的变量
root ……/$1;
}
这只是针对这个需求的简单实现,如果想要系统深入的学习一下,server_name
,和正则表达式
可以看看参考文章中的文章,都是写的很不错的。
最后
祝黄庭祥考研顺利。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。