- Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求
- 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库
- rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能
- 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的
- 链接,就可以设置为访问
- 另外还可以在一定程度上提高网站的安全性。
if 指令
用于条件匹配判断,并根据条件判断结果选择不同的
Nginx
配置,可以配置在
server
或
location
块中进行配置,Nginx
的
if
语法仅能使用
if
做单次判断,不支持使用
if else
或者
if elif
这样的多重判断,用法如下:
if (条件匹配) {action}
使用正则表达式对变量进行匹配,匹配成功时
if
指令认为条件为
true
,否则认为
false
,变量与表达式之间使用以下符号链接:
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
set 指令
指定
key
并给其定义一个变量,变量可以调用
Nginx
内置变量赋值给
key
另外
set
定义格式为
set $key value
,
value
可以是
text, variables
和两者的组合。
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
location /test3{
set $name lee;
echo $name;
}
}
测试:
[root@client ~]# curl lee.timinglee.org/test3
lee
break 指令
用于中断当前相同作用域
(location)
中的其他
Nginx
配置
与该指令处于同一作用域的
Nginx
配置中,位于它前面的配置生效
位于后面的
ngx_http_rewrite_module
模块中指令就不再执行
Nginx
服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server
块和
locationif
块中使用
检测:
return 指令
return
用于完成对请求的处理,并直接向客户端返回响应状态码,比如
:
可以指定重定向
URL(
对于特殊重定向状态码,301/302
等
)
或者是指定提示文本内容
(
对于特殊状态码
403/500
等
)
,处于此指令后的所有配置都将不被执行,return
可以在
server
、
if
和
location
块进行配置
rewrite 指令
通过正则表达式的匹配来改变
URI
,可以同时存在一个或多个指令,按照顺序依次对
URI
进行匹配rewrite主要是针对用户请求的
URL
或者是
URI
做具体处理
rewrite
将用户请求的
URI
基于
regex
所描述的模式进行检查,匹配到时将其替换为表达式指定的新的
URI
注意:如果在同一级配置块中存在多个
rewrite
规则,那么会自下而下逐个检查
;
被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,
但不超过
10
次
;
如果超过,提示
500
响应码,
[flag]
所表示的标志位用于控制此循环机制
如果替换后的
URL
是以
http://
或
https://
开头,则替换结果会直接以重定向返回给客户端
,
即永久重定向301
rewrite flag
使用介绍
利用
nginx
的
rewrite
的指令,可以实现
url
的重新跳转,
rewrite
有四种不同的
flag
,分别是
redirect(
临时重定向302)
、
permanent(
永久重定向
301)
、
break
和
last
。其中前两种是跳转型的
flag
,后两种是代理型
- 跳转型指由客户端浏览器重新对新地址进行请求
- 代理型是在WEB服务器内部实现跳转
redirect;# 临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新 URL 给客户端# 由客户端重新发起请求 ; 使用相对路径 , 或者 http:// 或 https:// 开头,状态码: 302permanent;# 重写完成后以永久重定向方式直接返回重写后生成的新 URL 给客户端# 由客户端重新发起请求,状态码: 301break;# 重写完成后 , 停止对当前 URL 在当前 location 中后续的其它重写操作# 而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在 location 中使用# 适用于一个 URL 一次重写last;# 重写完成后 , 停止对当前 URI 在当前 location 中后续的其它重写操作,# 而后对新的 URL 启动新一轮重写检查,不建议在 location 中使用# 适用于一个 URL 多次重写,要注意避免出现超过十次以及 URL 重写后返回错误的给用户
域名永久与临时重定向
永久的域名:
临时的:
案例
: break
与
last
测试:
访问
break
请求被
rewrite
至
test1
,而访问
test1
转递请求再次被
rewrite
发送至
test2
,此测试
last
和
break分别有什么区别
案例
:
自动跳转
https
案例:基于通信安全考虑公司网站要求全站
https
,因此要求将在不影响用户请求的情况下将
http
请求全部自动跳转至 https
,另外也可以实现部分
location
跳转
案例
:
判断文件是否存在
案例:当用户访问到公司网站的时输入了一个错误的
URL
,可以将用户重定向至官网首页
[root@centos8 ~]#vim /apps/nginx/conf.d/pc.conf
location / {
root /data/nginx/html/pc;
index index.html;
if (!-e $request_filename) {
rewrite .* http://www.timinglee.org/index.html; #实现客户端浏览器的302跳转
#rewrite .* /index.html; #web服务器内部跳转
}
}
#重启Nginx并访问测试
Nginx
防盗链
防盗链基于客户端携带的
referer
实现,
referer
是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer
就是之前的那个网站域名,正常的
referer
信息有以下几种:
none: #请求报文首部没有referer首部,
#比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org
www.timinglee.*
regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.timinglee\.com
实现盗链
Nginx
反向代理功能
反向代理:
reverse proxy
,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx
除了可以在企业提供高性能的
web
服务之外,另外还可以将
nginx
本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx
服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能
ngx_http_proxy_module: # 将客户端的请求以 http 协议转发至指定服务器进行处理ngx_http_upstream_module # 用于定义为 proxy_pass,fastcgi_pass,uwsgi_pass# 等指令引用的后端服务器分组ngx_stream_proxy_module: # 将客户端的请求以 tcp 协议转发至指定服务器处理ngx_http_fastcgi_module: # 将客户端对 php 的请求以 fastcgi 协议转发至指定服务器助理ngx_http_uwsgi_module: # 将客户端对 Python 的请求以 uwsgi 协议转发至指定服务器处理
实现
http
反向代理
[root@Nginx ~]# vim /apps/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.30;
}
location ~ \.(png|jpg|gif) {
proxy_pass http://172.25.254.20:8080;
}
}
缓存功能
缓存功能默认关闭状态
,
需要先动配置才能启用