匹配这两种特殊字符“~”或“~*”的区别为:“~”用于区分大小写(大小写敏感)的匹配;“~*”用于不区分大小写的匹配。还可以用逻辑操作符“!”对上面的匹配取反,即“!~”和“!~*”。此外,“^~”的作用是先进行字符串的前缀匹配(必须以后边的字符串开头),如果能匹配到,就不再进行其他location的正则匹配了。
6.5.2 location匹配示例
[root@localhost nginx]# cat /usr/local/nginx/conf/extra/www.conf server { listen 80; server_name www.yunjisuan.com; root /var/www/html/wwwcom; location / { return 401; } location = / { return 402; } location = /images/ { return 501; } location /documents/ { return 403; } location ^~ /images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; } }
正则匹配结果如下:
[root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com 402 #匹配了=的情况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/ 402 #匹配了=的情况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/xxxx 401 #匹配不到默认匹配 /的情况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/documents/ 403 #匹配字符串 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/images/ 501 #优先匹配=的情况 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/images/1.jpg 404 #匹配 [root@localhost nginx]# curl -s -o /dev/null -w "%{http_code}\n" www.yunjisuan.com/documents/images/1.jpg 500 #匹配~*的情况
从多个location的配置匹配可以看出匹配的优先顺序
顺序 | 匹配标识的location | 匹配说明 |
---|---|---|
1 | " location = / { " | 精确匹配 |
2 | " location ^~ /images/ { " | 先进行字符串的前缀匹配,如果匹配到就不做正则匹配检查 |
3 | " loction ~* \.(gif | jpg | jpeg)$ { " | 正则匹配,*为不区分大小写 |
4 | " location /documents/ { " | 匹配常规字符串,模糊匹配,如果有正则检查,正则优先 |
5 | " location / { " | 所有location都不能匹配后的默认匹配原则 |
6.6 Nginx rewrite
6.6.1 什么是Nginx rewrite?
和Apache等Web服务软件一样,Nginx rewrite的主要功能也是实现URL地址重写。Nginx的rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配。默认参数编译时,Nginx就会安装支持rewrite的模块,但是,也必须要有PCRE软件的支持。
6.6.2 Nginx rewrite 语法
(1)rewrite指令语法
指令语法:rewrite regex replacement 【flag】;
默认值:none
应用位置:server,location,if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转例子:
rewrite ^/(.*) http://www.baidu.com/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到http://www.baidu.com/$1 。这里的$1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.baidu.com/$1 地址上。
(2)regex常用正则表达式说明
(3)rewrite指令的最后一项参数flag标记的说明
- 在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
- last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{...}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。
6.6.3 Nginx rewrite 的企业应用场景
Nginx的rewrite功能在企业里应用非常广泛:
- 可以调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
- 为了让搜索引擎收录网站内容,并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务
- 网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
- 根据特殊变量,目录,客户端的信息进行URL跳转等。
6.6.4 Nginx rewrite 301 跳转
以往我们是通过别名方式实现yunjisuan.com和www.yunjisuan.com访问同一个地址的,事实上,除了这个方式外,还可以使用nginx rewrite 301 跳转的方式来实现。实现的配置如下:
[root@localhost nginx]# cat conf/extra/www.conf #www virtualhost by Mr.chen server { listen 80; server_name www.yunjisuan.com; root /var/www/html/wwwcom; location / { index index.html index.htm; } # location = / { # return 402; # } location = /images/ { return 501; } location /documents/ { return 403; } location ^~ /images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; } } server{ listen 80; server_name yunjisuan.com; rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent; #当用户访问yunjisuan.com及下面的任意内容时,都会通过这条rewrite跳转到www.yunjisuan.com对应的地址 }
客户端访问测试结果
6.6.5 实现不同域名的URL跳转
示例:实现访问http://mail.yunjisuan.com时跳转到http://www.yunjisuan.com/mail/yunjisuan.html
外部跳转时,使用这种方法可以让浏览器地址变为跳转后的地址,另外,要事先设置http://www.yunjisuan.com/mail/yunjisuan.html有结果输出,不然会出现401等权限错误。
(1)配置Nginx rewrite规则
[root@localhost nginx]# cat conf/extra/mail.conf server { listen 80; server_name mail.yunjisuan.com; location / { root /var/www/html/mailcom; index index.html index.htm; } if ( $http_host ~* "^(.*)\.yunjisuan\.com$") { set $domain $1; rewrite ^(.*) http://www.yunjisuan.com/$domain/yunjisuan.html break; } }
客户端访问测试
6.6.6 rewrite跳转标记flag使用总结
1,在根location(即location / {...})中或server{...} 标签中编写rewrite规则,建议使用last标记
2,在普通的location(例 location/yunjisuan/{...}或if{}中编写rewrite规则,则建议使用break标记)
6.7 Nginx访问认证
有时,在实际工作中企业要求我们为网站设置访问账号和密码权限,这样操作后,只有拥有账号密码的用户才可以访问网站内容。
这种使用账号密码才可以访问网站的功能主要应用在企业内部人员访问的地址上,例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIKI网站平台。
6.7.1 创建密码文件
我们可以借用apache的htpasswd软件,来创建加密的账号和密码
[root@localhost ~]# which htpasswd [root@localhost ~]# htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan 123123 Adding password for user yunjisuan [root@localhost ~]# cat /usr/local/nginx/conf/htpasswd yunjisuan:FC1/eEc/iK0Mo #账号密码是加密的(htpasswd是文件的名字)
6.7.2 在虚拟主机配置文件里加入两条配置信息
[root@localhost html]# cat /usr/local/nginx/conf/extra/blog.conf server { listen 80; server_name blog.yunjisuan.com; location / { root /var/www/html/blogcom; index index.html index.htm; auth_basic "yunjisuan training"; #加入这条配置 auth_basic_user_file /usr/local/nginx/conf/htpasswd; #加入这条配置 } } #配置解释: auth_basic :验证的基本信息选项(后边跟着的双引号里就是验证窗口的名字) auth_basic_user_file :验证的用户文件(后边根账号密码文件的绝对路径)
6.7.3 网页登陆验证
6.8 Nginx相关问题解答
6.8.1 Tengine和Nginx是什么关系?
Tengine是淘宝开源Nginx的分支,官方站点为http://tengine.taobao.org/
6.8.2 访问Nginx时出现状态码“403 forbidden”的原因
(1)Nginx配置文件里没有配置默认首页参数,或者首页文件在站点目录下没有如下内容:
index index.php index.html index.htm;
(2)站点目录或内部的程序文件没有Nginx用户访问权限
(3)Nginx配置文件中设置了allow,deny等权限控制,导致客户端没有访问权限。
7 本章知识点回顾
- Nginx的特性优点
- 主流Web动态静态性能对比
- Apache select 和Nginx epoll 模型的区别(面试常考)
- 虚拟主机概念及类型分类详解
- 基于域名和端口虚拟主机的介绍及搭建
- Nginx错误,访问日志,以及访问日志切割
- Nginx访问状态信息介绍及配置实践。
- Nginx location介绍及配置实践
- Nginx rewrite介绍及配置实践
- Nginx Web访问认证介绍及配置实践