rewrite主要功能就是实现URL的重写,Nginx的rewrite规则采用PCRE。Perl兼容正则表达式的雨打进行规则匹配,如果需要Nginx的rewrite功能,在编译Nginx时需要安装PCRE库。rewrite指令可以放在server, location 和 if 模块中。
rewrite格式是:rewrite regex replacement flag
示例:rewrite ^/b/(.*)\.html /play.php?video=$1 break;
rewrite指令的最后一项参数为flag标记,支持的flag主要有一下几个:
last:相当于Apache里的[L]标记,表示完成rewrite
break:该指令的作用是完成当前的规则集,不再处理rewrite指令。本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect:返回302临时重定向,浏览器地址栏显示跳转后的URL地址
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
last和break用来实现URI重写,浏览器地址栏URL地址不变
redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址
一般在跟location中(location /{...})或直接在server标签中编写rewrite规则,推荐使用last标记;在非根location中(location /cms/{...}),则使用break。
例如:
rewrite ^/test(.*)$ http://www.tiyee.net/home permanent;
访问http://www.tiyee.net/test?id=5 会跳转到 http://www.tiyee.net/home?id=5
例如:如果我们将类似URL /photo/123456 重定向到 /path/to/photo/12/1234/123456.png
Rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})" /path/to/photo/$1/$1$2/$1$2$3.png ;
注:如果正则表达式里面有花括号"{"或"}" ,应该使用双引号或单引号。
实例:
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.文件反盗链并设置过期时间 这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求 “rewrite ^/ http://img.tiyee.net/leech.gif;”显示一张防盗链图片 “access_log off;”不记录访问日志,减轻压力 “expires 3d”所有文件3天的浏览器缓存 location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194; if ($invalid_referer) { rewrite ^/ http://img.tiyee.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.将根目录下某个文件夹指向2级目录 如/shanghaijob/ 指向 /area/shanghai/ 如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/ rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last; 14.文件和目录不存在的时候重定向: if (!-e $request_filename) { proxy_pass http://127.0.0.1; } 15.URL rewrite和反向代理同时进行 location /news/{ proxy_pass http://192.168.1.100; }
本文出自 “梦朝思夕” 博客,请务必保留此出处http://qiangmzsx.blog.51cto.com/2052549/1381591
Nginx的rewrite指令,布布扣,bubuko.com
原文:http://qiangmzsx.blog.51cto.com/2052549/1381591