Nginx转发匹配规则的实现
⼀、正则表达式匹配
~ 为区分⼤⼩写匹配
~* 为不区分⼤⼩写匹配
!~ 和 !~* 分别为区分⼤⼩写不匹配及不区分⼤⼩写不匹配
⼆、⽂件及⽬录匹配
-f 和 !-f ⽤来判断是否存在⽂件
-d 和 !-d ⽤来判断是否存在⽬录
-e 和 !-e ⽤来判断是否存在⽂件或⽬录
-x 和 !-x ⽤来判断⽂件是否可执⾏
三.rewrite指令的最后⼀项参数为flag标记,flag标记有
last 相当于 apache ⾥⾯的[L]标记,表⽰ rewrite。
break 本条规则匹配完成后,终⽌匹配,不再匹配后⾯的规则。
redirect 返回302临时重定向,浏览器地址会显⽰跳转后的URL地址。
permanent  返回301永久重定向,浏览器地址会显⽰跳转后的URL地址。
使⽤ last 和 break 实现URI重写,浏览器地址栏不变。
⽽且两者有细微差别,使⽤alias指令必须⽤ last标记;使⽤proxy_pass指令时,需要使⽤break标记。Last标记在本条rewrite 规则执⾏完毕后,会对其所在server{......}标签重新发起请求,⽽break标记则在本条规则匹配完成后,终⽌匹配。
例如:如果我们将类似URL/photo/123456 重定向到 /path/to/photo/12/1234/123456.png
rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"
rewrite "/path/to/photo/$1/$1$2/$1$2$3.png" ;
四、NginxRewrite 规则相关指令
1、break指令
使⽤环境:server、location、if
该指令的作⽤是完成当前的规则集,不再处理rewrite指令。
正则匹配 链接 无域名的链接2、if 指令
使⽤环境:server、location
该指令⽤于检查⼀个条件是否符合,如果条件符合,则执⾏⼤括号内的语句。If指令不⽀持嵌套,不⽀持多个条件&&和||处理。
3、return指令
语法:returncode
使⽤环境:server、location、if
该指令⽤于结束规则的执⾏并返回状态码给客户端。
⽰例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
location ~ .*\.(sh|bash)?$
{
return 403;
}
4、rewrite 指令
语法:rewriteregex replacement flag
使⽤环境:server、location、if
该指令根据表达式来重定向URI,或者修改字符串。指令根据配置⽂件中的顺序来执⾏。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使⽤if语句,⽰例如下:
if( $host ~* www\.(.*) )
{
set $host_without_www $1;
rewrite ^(.*)$ $host_without_www$1permanent;
}
5、Set指令
语法:setvariable value ;
默认值:none
使⽤环境:server、location、if
该指令⽤于定义⼀个变量,并给变量赋值。变量的值可以为⽂本、变量以及⽂本变量的联合。set$varname "hello world";
6、Uninitialized_variable_warn指令
语法:uninitialized_variable_warnon|off
使⽤环境:http、server、location、if
该指令⽤于开启和关闭未初始化变量的警告信息,默认值为开启。
五.Nginx的Rewrite规则编写实例
1、当访问的⽂件和⽬录不存在时,重定向到某个html⽂件
if( !-e $request_filename )
{
rewrite ^/(.*)$ index.htmllast;
}
2、⽬录对换 /123456/xxxx  ====>  /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
3、如果客户端使⽤的是IE浏览器,则重定向到/ie⽬录下
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}
4、禁⽌访问多个⽬录
location ~ ^/(cron|templates)/
{
deny all;
break;
}
5、禁⽌访问以/data开头的⽂件
location ~ ^/data
{
deny all;
}
6、禁⽌访问以.sh,.flv,.mp3为⽂件后缀名的⽂件
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}
7、设置某些类型⽂件的浏览器缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)$
{
expires 1h;
}
8、给favicon.ico和设置过期时间
这⾥为favicon.ico为99天,为7天并不记录404错误⽇志
location ~(favicon.ico) {
log_not_found off;
expires 99d;
break;
}
location ~() {
log_not_found off;
expires 7d;
break;
}
9、设定某个⽂件的过期时间;这⾥为600秒,并不记录访问⽇志
location ^~ /html/scripts/loadhead_1.js {
access_log off;
root /opt/lampp/htdocs/web;
expires 600;
break;
}
10、⽂件反盗链并设置过期时间
这⾥的return412 为⾃定义的http状态码,默认为403,⽅便出正确的盗链的请求rewrite ^/ http: //img.linuxidc/leech.gif;//显⽰⼀张防盗链图⽚
access_log off; //不记录访问⽇志,减轻压⼒
expires 3d //所有⽂件3天的浏览器缓存
location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.linuxidc*.linuxidc localhost 208.97.167.194;
if ($invalid_referer) {
rewrite ^/ img.linuxidc/leech.gif;
return 412;
break;
}
access_log off;
root /opt/lampp/htdocs/web;
expires 3d;
break;
}
11、只允许固定ip访问⽹站,并加上密码
root /opt/htdocs/www;
allow 208.97.167.194;
allow 222.33.1.2;
allow 231.152.49.4;
deny all;
auth_basic “C1G_ADMIN”;
auth_basic_user_file htpasswd;
12、将多级⽬录下的⽂件转成⼀个⽂件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html
rewrite^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;
13、⽂件和⽬录不存在的时候重定向:
if (!-e $request_filename) {
proxy_pass 127.0.0.1;
}
14、将根⽬录下某个⽂件夹指向2级⽬录
如/shanghaijob/指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
上⾯例⼦有个问题是访问/shanghai时将不会匹配
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
这样/shanghai 也可以访问了,但页⾯中的相对链接⽆法使⽤,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导⾄⽆法访问。
那我加上⾃动跳转也是不⾏咯
(-d $request_filename)它有个条件是必需为真实⽬录,⽽我的rewrite不是的,所以没有效果
if (-d $request_filename){
rewrite ^/(.*)([^/])$ $host/$1$2/permanent;
}
知道原因后就好办了,让我⼿动跳转吧
rewrite ^/([0-9a-z]+)job$ /$1job/permanent;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
15、域名跳转
server{
listen  80;
server_name jump.linuxidc;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rewrite ^/ www.linuxidc/;
access_log off;
}
16、多域名转向
server_name www.linuxidcwww.linuxidc;
index index.html index.htm index.php;
root /opt/lampp/htdocs;
if ($host ~ "linuxidc\") {
rewrite ^(.*) www.linuxidc$1permanent;
}
六、nginx全局变量
arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。
args    #这个变量等于请求⾏中(GET请求)的参数,如:foo=123&bar=blahblah;
binary_remote_addr #⼆进制的客户地址。
body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
content_length #请求头中的Content-length字段。
content_type  #请求头中的Content-Type字段。
cookie_COOKIE #cookie COOKIE变量的值
document_root #当前请求在root指令中指定的值。
document_uri  #与uri相同。
host    #请求主机头字段,否则为服务器名称。
hostname  #Set to themachine's hostname as returned by gethostname
http_HEADER
is_args    #如果有args参数,这个变量等于”?”,否则等于”",空值。
http_user_agent #客户端agent信息
http_cookie  #客户端cookie信息
limit_rate  #这个变量可以限制连接速率。
query_string  #与args相同。
request_body_file #客户端请求主体信息的临时⽂件名。
request_method #客户端请求的动作,通常为GET或POST。
remote_addr  #客户端的IP地址。
remote_port  #客户端的端⼝。
remote_user  #已经经过Auth Basic Module验证的⽤户名。
request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后⼀个时,为空(Empty)。request_method #GET或POST
request_filename #当前请求的⽂件路径,由root或alias指令与URI请求⽣成。
request_uri  #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
scheme    #HTTP⽅法(如http,https)。
server_protocol  #请求使⽤的协议,通常是HTTP/1.0或HTTP/1.1。
server_addr  #服务器地址,在完成⼀次系统调⽤后可以确定这个值。
server_name  #服务器名称。
server_port  #请求到达服务器的端⼝号。
七、Apache和Nginx规则的对应关系
Apache的RewriteCond对应Nginx的if
Apache的RewriteRule对应Nginx的rewrite
Apache的[R]对应Nginx的redirect
Apache的[P]对应Nginx的last
Apache的[R,L]对应Nginx的redirect
Apache的[P,L]对应Nginx的last
Apache的[PT,L]对应Nginx的last
例如:允许指定的域名访问本站,其他的域名⼀律转向www.jb51
Apache:
RewriteCond %{HTTP_HOST} !^(.*?)\.aaa\$[NC]
RewriteCond %{HTTP_HOST} !^localhost$
RewriteCond %{HTTP_HOST}!^192\.168\.0\.(.*?)$
RewriteRule ^/(.*)$ //www.jb51[R,L]
Nginx过滤⽰例:
if( $host ~* ^(.*)\.aaa\$ )
{
set $allowHost ‘1';
}
if( $host ~* ^localhost )
{
set $allowHost ‘1';
}
if( $host ~* ^192\.168\.1\.(.*?)$ )
{
set $allowHost ‘1';
}
if( $allowHost !~ ‘1' )
{
rewrite ^/(.*)$ //www.jb51redirect ;
}
总结
后端开发是⼀个最接近全栈的⼀个职业,前端不够⽤后端顶上写页⾯JS,没有运维不要紧后端来维护服务器,总之⼀个好的后端就是能⾯⾯俱到。
到此这篇关于Nginx 转发匹配规则的实现的⽂章就介绍到这了,更多相关Nginx 转发匹配规则内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。