一、Nginx常见模块
http
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。
server
server块,虚拟主机(虚拟服务器)。作用:使得Nginx服务器可以在同一台服务器上只要运行一组Nginx进程,就可以运行多个网站。
location
location块是server块的一个指令。作用:基于Nginx服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url匹配,对特定请求进行处理。
在http模块中有server,server模块中有location,location匹配的是uri,例如/test、/image
二、Nginx中常用正则表达式
^ | 字符串的起始位置 |
$ | 字符串的结尾位置 |
* | 匹配所有 |
+ | 匹配前面的字符至少一次 |
? | 匹配前面的字符0次或者1次 |
. | 任意单个字符 |
{n} | 连续重复出现n次 |
{n,m} | 连续重复出现n-m次 |
[a-z0-9A-Z] | 范围匹配,匹配0-9和a-z以及A-Z |
[c] | 匹配单个字符c |
() | 分组 |
| | 或 |
三、Location
3.1 location匹配方式
1、精确匹配
location = /{...}
要完整的路径,一个字不能少,也不能错
2、正则匹配
location ~ / {...}
location ^~:前缀匹配,以什么为开头
location ~:区分大小写进行匹配
location ~*:不区分大小写进行匹配
location !~:区分大小写取反匹配
location !~*:不区分大小写取反匹配
3、一般匹配
location / {...}
注意:location匹配一旦匹配成功,便不再向下继续匹配
3.2 location匹配的优先级
精确匹配优先级>正则匹配>一般匹配
实验:往三个目录中传入内容不同但是在各自目录都叫1.jpg的图片,查看location会匹配哪一个
[root@nginx1 conf]# vim nginx.conf
server {
...
location = /1.jpg {
root /data/nginx/static1;
}
location /1.jpg {
root /data/nginx/static2;
}
location ~* \.(gif|jpg|jpeg)$ {
root /data/nginx/static3;
}
...
}
[root@nginx1 conf]# nginx -t
[root@nginx1 conf]# systemctl restart nginx
[root@nginx1 conf]# cd /
[root@nginx1 /]# mkdir -p /data/nginx
[root@nginx1 /]# cd /data/nginx
[root@nginx1 nginx]# mkdir static1 static2 static3
[root@nginx1 nginx]# cd static1
--传入图片1--
[root@nginx1 static1]# cd ..
[root@nginx1 nginx]# cd static2
--传入图片2并改名为1.jpg--
[root@nginx1 nginx]# mv 2.jpg 1.jpg
[root@nginx1 static2]# cd ..
[root@nginx1 nginx]# cd static3
--传入图片3并改名为1.jpg--
[root@nginx1 static3]# mv 3.jpg 1.jpg
浏览器访问20.0.0.61/1.jpg验证发现是static1中的图片
将精准匹配的location模块注释掉,再次用浏览器访问20.0.0.61/1.jpg
结果是正则匹配location模块指定的static3目录中的图片
总结:
(location=完整路径)>(location ^~ 路径)>(location~,~*正则顺序)>(location不分起始路径)>(location /)
3.3 工作当中配置location的原则
1、网站首页:都是精确匹配,网站首页一般都是一个静态页面,匹配网站的根工作目录
即location = /{...}
2、处理静态文件的请求:目录匹配和后缀匹配结合
即location ^~ /static {...}
location ~* \.{html|jpg|jpeg|gif|png}${...}
3、一般规则:处理动态请求,把动态请求转发给后端的动态页面的服务器
即location /{
proxy_pass http://tomcat server;
}
四、rewrite
4.1 rewrite简介
结合nginx提供的全局变量和自定义的变量,再结合正则表达式以及标志位实现url重写以及重定向
4.2 rewrite执行顺序
1、先执行server块里面的rewrite
2、执行location块里面定义的rewrite
3、选定location中的rewrite
(在rewrite中可以支持if语句,只有if,没有else)
4.3 rewrite语法
rewrite <regex> <replacement> [flag];
<regex>:正则表达式
<replacement>:跳转的内容或者路径
[flag]:标志位
-------------------------------------------------------------------------------------------
标志位:
last: 本条规则匹配完成后,继续向下匹配新的location URI规则
break: 本条规则匹配完之后立即终止,页面内容变化,但是uri不变
redirect: 临时重定向,302,uri的地址会发生变化
permanent:永久重定向,301,uri地址也会发生变化
永久重定向实验
[root@nginx1 conf]# vim nginx.conf
...
server {
listen 80;
server_name localhost;
location / {
rewrite /test/(.*) /pup/$1 permanent;
root html;
index index.html index.htm;
}
-------------------------------------------------------------------------------------------
rewrite /test/(.*) /pup/$1 permanent;
只要访问test就会跳转到pup
.*:表示匹配所有
$1:表示捕获组,引用正则表达式的第一个捕获组,即是.*的内容
例如:访问www.pup.com/test/index.html
即会跳转到www.pup.com/pup/index.html
-------------------------------------------------------------------------------------------
[root@nginx1 pup]# nginx -t
[root@nginx1 pup]# systemctl restart nginx
[root@nginx1 conf]# cd ..
[root@nginx1 nginx]# cd html/
[root@nginx1 html]# mkdir test pup
[root@nginx1 html]# cd test/
[root@nginx1 test]# echo 'this is test' > index.html
[root@nginx1 test]# cd ..
[root@nginx1 html]# cd pup/
[root@nginx1 pup]# echo 'this is pup' > index.html
浏览器访问20.0.0.61/test
临时重定向实验
[root@nginx1 conf]# vim nginx.conf
server {
listen 80;
server_name localhost;
location / {
rewrite /test/(.*) /pup/$1 redirect;
root html;
index index.html index.htm;
}
[root@nginx1 conf]# nginx -t
[root@nginx1 conf]# systemctl restart nginx
浏览器访问20.0.0.61/test
永久重定向和临时重定向的区别:
影响搜索引擎的权重
永久重定向会加入到搜索引擎的排名
临时不会加入搜索引擎的权重
break实验
last实验
[root@nginx1 conf]# vim nginx.conf
server {
listen 80;
server_name localhost;
location /test1 {
rewrite /test1/(.*) /test2/$1 last;
index index.html index.htm;
}
location /test2 {
rewrite /test2/(.*) /test1/$1 last;
index index.html index.htm;
}
[root@nginx1 conf]# nginx -t
[root@nginx1 conf]# systemctl restart nginx
[root@nginx1 conf]# cd ..
[root@nginx1 nginx]# cd html
[root@nginx1 html]# mkdir test1 test2
[root@nginx1 html]# cd test1
[root@nginx1 test1]# echo 123 > index.html
[root@nginx1 test1]# cd ..
[root@nginx1 html]# cd test2
[root@nginx1 test2]# echo 456 > index.html
浏览器访问20.0.0.61/test1
解决方法:
write和location的区别:
rewrite是在同一域名之内更改获取资源的路径
location是对路径访问控制
4.4 rewrite实验
1、基于域名的访问跳转
某公司旧域名为www.pup.com,但是公司业务变更,迁移到了新的域名:www.benet.com
但是旧域名不能被废除,访问pup可以跳转到benet,且匹配的uri不变
[root@nginx1 conf]# vim nginx.conf
server {
listen 80;
server_name www.pup.com;
location / {
if ($host = 'www.pup.com') {
rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
}
root html;
index index.html index.htm;
}
}
[root@nginx1 conf]# nginx -t
[root@nginx1 conf]# systemctl restart nginx
[root@nginx1 conf]# cd ..
[root@nginx1 nginx]# cd html/
[root@nginx1 html]# echo 'this is pup' > index.html
[root@nginx1 html]# echo '20.0.0.61 www.kgc.com www.benet.com' >> /etc/hosts
2、基于ip的访问跳转
某公司业务新版上线,用户访问网站统一显示固定的维护页面,只有20.0.0.61可以访问
[root@nginx1 conf]# vim nginx.conf
server {
listen 80;
server_name www.pup.com;
set $rewrite true;
if ($remote_addr = "20.0.0.61"){
set $rewrite false;
}
if ($rewrite = true) {
rewrite (.+) /error.html;
}
location = /error.html {
root html;
}
location / {
root html;
index index.html index.htm;
}
[root@nginx1 conf]# nginx -t
[root@nginx1 conf]# systemctl restart nginx
[root@nginx1 conf]# cd ..
[root@nginx1 nginx]# cd html/
[root@nginx1 html]# echo "error!" > error.html
20.0.0.61访问
20.0.0.62访问
3、基于目录下所有php结尾的文件跳转
[root@nginx1 conf]# vim nginx.conf
server {
listen 80;
server_name www.pup.com;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.test.com permanent;
}
location / {
root html;
index index.html index.htm;
}
[root@nginx1 conf]# nginx -t
[root@nginx1 conf]# systemctl restart nginx
[root@nginx1 conf]# cd ..
[root@nginx1 nginx]# cd html/
[root@nginx1 html]# mkdir upload
[root@nginx1 html]# cd upload/
[root@nginx1 upload]# echo 123 > index.php
[root@nginx1 upload]# vim /etc/hosts
20.0.0.61 www.test.com
浏览器访问20.0.0.61/upload/index.php