功能
Nginx服务器利用ngx_http_rewrite_module 模块解析和处理理rewrite请求,此功能依靠PCRE(Perl Compatible Regular Expressions),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性
PCRE官方站点: http://www.pcre.org/
模块指令
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
if
使用
Nginx的if语法仅能用if做单次判断,不支持使用if else或者if elif这样的多重判断,可以配置在server或location块中进行配
语法
if (条件匹配) {
action
}
正则表达式
=:比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
!=: 比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
~:表示在匹配过程中区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足为假。
!~:为区分大小写字符且匹配结果不匹配,不足满为真,满足为假。
~*: 表示在匹配过程中不区分大小写字符,(可以通过正则表达式匹配),满足匹配条件真,不满足为假。
!~*: 为不区分大小字符且匹配结果不匹配,满足为假,不满足为真。
-f 和 ! -f: 判断请求的文件是否存在和是否不存在
-d 和 ! -d: 判断请求的目录是否存在和是否不存在。
-x 和 ! -x: 判断文件是否可执行和是否不可执行。
-e 和 ! -e: 判断请求的文件或目录是否存在和是否不存在(包括文件、目录、软链接)。
案例
文件存在
location /m78 {
root /data/nginx/html/pc;
default_type text/html;
if (-f $request_filename){
echo "look look look";
}
}
}
文件不存在
location /m78 {
root /data/nginx/html/pc;
default_type text/html;
if (-f $request_filename){
echo "look look look";
}
}
}
判断网站的协议
location /m78 {
root /data/nginx/html/pc/www;
default_type text/html;
if ( $scheme = http ){
echo "website is http";
}
if ( $scheme = https ){
echo "website is https";
}
}
}
set
使用
自定义变量,定义的变量可以调用nginx内置变量,也可以调用值
语法
set $key $value
案例
location /m78 {
root /data/nginx/html/pc/www;
default_type text/html;
if ( $scheme = http ){
echo "website is http";
}
if ( $scheme = https ){
echo "website is https";
}
}
break
使用
退出操作,不在执行后面的指令,可以使用在server,location,if
案例
location /m78 {
root /data/nginx/html/pc/www;
default_type text/html;
set $name fxq;
echo $name;
break;
set $port $server_port;
echo $port;
}
}
return
使用
return⽤用于完成对请求的处理,并直接向客户端返回响应状态码,可以指定重定向URL或者指定提示文本内容(特殊状态码403/500等),处于此指令所有配置不执行,可应用在server,if,location
语法
return code; 返回给客户端指定的HTTP状态码
return code (text); 返回给客户端的状态码及响应体内容,可以调用变量
return code URL;返回给客户端的URL地址
案例
返回状态码
location /m78 {
root /data/nginx/html/pc/www;
default_type text/html;
if ( $scheme = http ) {
return 555;
}
}
}
返回状态码并显示文本内容
location /m78 {
root /data/nginx/html/pc/www;
default_type text/html;
if ( $scheme = http ) {
return 555 " website is no exist";
}
}
}
返回状态码并跳转
location /m78 {
root /data/nginx/html/pc/www;
default_type text/html;
if ( $scheme = http ) {
return 301 http://xiaodi8.com/;
}
}
}
rewrite_log
使用
设置是否开启记录ngx_http_rewrite_module模块日志记录到error_log日志文件当中,可以配置http、server、location或if当中,需要日志级别为notice
rewrite
URL和URI
URI(universal resource identifier):通用资源标识符,标识一个资源的路径,可以不带协议。
URL(uniform resource location):统一资源定位符,是用于在Internet中描述资源的字符串,是
URI的子集,主要包括传输协议(scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分,⼀一般格式为 scheme://主机名[:端口号][/资源路径],如:http://www.a.com:8080/path/file/index.html就是⼀一个URL路径,URL必须带访问协议。
每个URL都是⼀个URI,但是URI不都是URL。例如:
http://example.org:8080/path/to/resource.txt #URI/URL
ftp://example.org/resource.txt #URI/URL
/absolute/path/to/resource.txt #URI
使用
可以配置server、location、if
参考:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
语法
rewrite regex replacement [flag];
rewrite 正则匹配客户端请求 修改后的请求 标记位;
注意
如果在同⼀级配置块中存在多个rewrite规则,那么会自下⽽下逐个检查;被某条件规则替换完成后,会重新⼀轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制,如果替换后的URL是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301
rewrite flag
使用
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向,状态码302)、permanent(永久重定向,状态码301)、break和last。其中前两种是跳转型的flag,后两种是代理型,跳转型是指有客户端浏览器重新对新地址进行请求,代理型是在WEB服务器内部实现跳转的。
参数
redirect;临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
last;重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在多location配置环境中使用
break;重写完成后停止对当前URL在当前location中后续的其它重写操作,而后直接将匹配结果返还给客户端即结束循环并返回数据给客户端,建议在多location配置环境中使用
案例
permanent
location /m78 {
root /data/nginx/html/pc;
default_type text/html;
rewrite / http://xiaodi8.com permanent;
}
}
redirect
location /m78 {
root /data/nginx/html/pc;
default_type text/html;
rewrite / http://xiaodi8.com redirect;
}
}
break
1.结束当前location后续的write操作
2.break结束后会直接返回数据,不会跳出当前location再对URL进行和其他location匹配
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.fxq.com.crt;
ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.fxq.com;
location / {
root /data/nginx/html/pc;
index index.html;
}
location = /favicon.ico {
root /data/nginx/html/pc;
}
location /break {
#return 666 "break";
root /data/nginx;
index index.html;
rewrite ^/break/(.*) /test1/$1 break;#break匹配成功后不再向下匹配,也不会跳转到其他的location,即直接结束匹配并给客户端返回结果数据。
rewrite ^/break/(.*) /test1/$2 break;#break不会匹配后面的rewrite规则也不匹配其location
}
location /test1 {
#return 999 "test1";
root /data/nginx;
index index.html;
}
location /test2 {
#return 777;
root /data/nginx;
index index.html;
}
}
last
1.结束当前location后续的write操作
2.当前location的write结束后会将产生的新的URL跳出当前loction进行与其他location的匹配
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.fxq.com.crt;
ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.fxq.com;
location / {
root /data/nginx/html/pc;
index index.html;
}
location = /favicon.ico {
root /data/nginx/html/pc;
}
location /break {
#return 666 "break";
root /data/nginx;
index index.html;
rewrite ^/break/(.*) /test1/$1 last;
rewrite ^/break/(.*) /test1/$2 last;
}
location /test1 {
#return 999 "test1";
root /data/nginx;
index index.html;
}
location /test2 {
#return 777;
root /data/nginx;
index index.html;
}
}
自动跳转http
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.fxq.com.crt;
ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.fxq.com;
location / {
root /data/nginx/html/pc;
index index.html;
if ( $scheme = http ) { #未加条件判断,会导致死循环
rewrite / https://www.fxq.com/;
}
}
location = /favicon.ico {
root /data/nginx/html/pc;
}
}
判断文件是否存在
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
listen 443 ssl;
ssl_certificate /apps/nginx/certs/www.fxq.com.crt;
ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.fxq.com;
location / {
root /data/nginx/html/pc;
index index.html;
if ( !-f $request_filename ) {
rewrite (.*) https://www.fxq.com/;
}
}
location = /favicon.ico {
root /data/nginx/html/pc;
}
}
文件绝对安全
chattr +i 文件