Nginx Rewrite规则与使用介绍和技巧实例,本文讲解了正则表达式匹配、文件及目录匹配、flag标记、Nginx Rewrite相关指令等内容 一.正则表达式匹配,其中:
* ~ 为区分大小写匹配 二.文件及目录匹配,其中:
* -f和!-f用来判断是否存在文件 三.rewrite指令的最后一项参数为flag标记,flag标记有:
1.last 相当于apache里面的[L]标记,表示rewrite。
使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{……}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。
rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png ;
四.NginxRewrite 规则相关指令 1.break指令
使用环境:server,location,if; 2.if指令
使用环境:server,location 3.return指令
语法:returncode ; location ~ .*\.(sh|bash)?$ { return 403; }
4.rewrite 指令
语法:rewriteregex replacement flag if( $host ~* www\.(.*) ) { set $host_without_www $1; rewrite ^(.*)$ http://$host_without_www$1permanent; }
5.Set指令
语法:setvariable value ; 默认值:none; 使用环境:server,location,if; 6.Uninitialized_variable_warn指令
语法:uninitialized_variable_warnon|off 五.Nginx的Rewrite规则编写实例 1.当访问的文件和目录不存在时,重定向到某个php文件 if( !-e $request_filename ) { rewrite ^/(.*)$ index.php last; } 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和robots.txt设置过期时间; 这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志 location ~(favicon.ico) { log_not_found off; expires 99d; break; } location ~(robots.txt) { 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,方便找出正确的盗链的请求
location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers none blocked *.it.net.cn*.linuxidc.net localhost 208.97.167.194; if ($invalid_referer) { rewrite ^/ http://img.linuxidc.net/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 http://127.0.0.1; } 14.将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
if (-d $request_filename){ rewrite ^/(.*)([^/])$ http://$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.it.net.cn; index index.html index.htm index.php; root /opt/lampp/htdocs/www; rewrite ^/ http://www.it.net.cn/; access_log off; } 16.多域名转向 server_name www.it.net.cn www.it.net.cn; index index.html index.htm index.php; root /opt/lampp/htdocs; if ($host ~ "linuxidc\.net") { rewrite ^(.*) http://www.it.net.cn$1permanent; } 六.nginx全局变量
arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。 七.Apache和Nginx规则的对应关系
Apache的RewriteCond对应Nginx的if
例如:允许指定的域名访问本站,其他的域名一律转向www.linuxidc.net RewriteCond %{HTTP_HOST} !^(.*?)\.aaa\.com$[NC] RewriteCond %{HTTP_HOST} !^localhost$ RewriteCond %{HTTP_HOST}!^192\.168\.0\.(.*?)$ RewriteRule ^/(.*)$ http://www.it.net.cn[R,L]
Nginx: if( $host ~* ^(.*)\.aaa\.com$ ) { set $allowHost ‘1'; } if( $host ~* ^localhost ) { set $allowHost ‘1'; } if( $host ~* ^192\.168\.1\.(.*?)$ ) { set $allowHost ‘1'; } if( $allowHost !~ ‘1' ) { rewrite ^/(.*)$ http://www.linuxidc.netredirect ; } 重写规则在许多地方都要使用到,整理在这里,方便之后使用到时候随时查找。 (责任编辑:IT) |