概述RewritingURL是一个非常有用的功能,因为它可以让你提高搜索引擎读取和索引你的网站的能力;而当你改变的时候,一旦你有了自己的站点结构,你就不需要要求用户修改他们的书签,其他站点也不需要修改他们的链接;它还可以提高您网站的安全性;它通常会使您的网站更加实用和专业。NginxRewrite规则相关指令NginxRewrite规则相关指令包括if、rewrite、set、return、break等,其中rewrite是最关键的指令。rewrite可以写在server段,也可以写在location段,后面出现的先申请#判断访问地址if($remote_addr=192.168.1.100){return403;}#判断访问是否为ie;if($http_user_agent~MSIE){重写^.*$/ie.htm;休息;#如果没有break,则循环重定向(即改写成ie.htm,然后发现是ie,改写成ie.htm...)}#跳转到404if(!-e$document_root$fastcgi_script_name){重写^.*$/404.html;break;}注意:Nginx对配置的格式要求很严格,if后面必须有空格,运算符前后也必须有空格分隔if空格(条件){rewritemode}的核心rewrite是正则表达式,只要知道语法规则就可以参考规则~为区分大小写的匹配~*为不区分大小写的匹配!~和!~*分别是区分大小写的不匹配和不区分大小写的不匹配-f和!-f用于判断文件是否存在-d和!-d用于判断目录是否存在-e和!-e用于判断文件或目录是否存在-x和!-x用于判断文件是否可执行。last相当于Apache中的[L]标记,表示rewrite完成。这应该是最常用的一套。设置变量return返回状态码break终止匹配,不再匹配以下规则redirect返回302临时重定向地址栏会显示重定向地址永久返回301永久重定向地址栏会显示重定向地址内置变量引用$args,请求中的参数;$content_length,HTTP请求信息中的“Content-Length”;$content_type,请求信息中的"Content-Type";$document_root,为当前请求的根路径设置值;$document_uri,与$uri相同;$host,请求信息中的“Host”,如果请求中没有Host行,则等于设置的服务器名;$limit_rate,连接速率的限制;$request_method,请求的方法,如“GET”、“POST”等;$remote_addr,客户端地址;$remote_port,客户端端口号;$remote_user,客户端用户名,用于认证;$request_filename,当前请求文件路径名;$request_body_file$request_uri,请求URI,带有查询字符串;$query_string,与$args相同;$scheme,使用的协议,比如http或者https,比如rewrite^(.+)$$scheme://example.com$1redirect;$server_protocol,请求的协议版本,"HTTP/1.0"或"HTTP/1.1";$server_addr,服务器地址,如果不使用listen指定服务器地址,使用该变量会发起系统调用获取地址(造成资源浪费);$server_name,请求到达的服务器名称;$server_port,请求到达的服务器端口号;$uri,请求的URI,可能与原值不同,比如重定向后上面的变量也可以用来打印日志。例如分析,Example1中不存在的文件跳转到404.htmlif(!-e$document_root$fastcgi_script_name){rewrite^.*$/404.html;break;}/*添加break,以不存在的页面xx.com/dsafsd.html为例。让我们观察访问日志。日志中显示的访问路径依然是GET/dsafsd.htmlHTTP/1.1提示:服务器内部的rewrite与302重定向不同。302跳转url会变,变成新的http请求404.html,而内部rewrite,context没有变,也就是说fastcgi_script_name还是dsafsd.html,所以会循环重定向。*/Example2没有使用break,为ie访问重写if($http_user_agent~*msie){//如果是ie访问,则设置变量为1;set$isie1;}if($fastcgi_script_name=ie.html){//如果访问脚本是ie.html,变量为0;set$isie0;}if($isie1){//一起,如果ie访问ie.html,脚本不会被重写;rewrite^.*$ie.html;}Example3目录自动添加/if(-d$request_filename){rewrite^/(.*)([^/])$http://$host/$1$2/permanent;}用(1)匹配最后一个非'/'的字符,然后强行加一个'/'($2变量后面的那个)Example4Nginx反盗链位置~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)${valid_referersnoneblocked*.nixi8.comnixi8.comlocalhost192.168.42.188;#定义none(空,直接访问),blocked(防火墙标记的路径),nixi8.com的二级域名和一级域名,localhost,192.168.42.188if($invalid_referer){#如果不是上面定义的重写之一^/http://www.nixi8.com/none.gif;#重写为gif图片;返回412;休息;}access_log关闭;#关闭日志减少服务器root/opt/lampp/htdocs/web的丢失;3d到期;break;}Example5hideindex.php在Apache下,只要在全局配置文件中设置默认主页index.php,就可以直接到达index.php,但是nginx只能到达index.html而不能到达index.html。php默认,所以我们必须重写它以支持break;}if(!-e$request_filename){rewrite^/(.*)$/index.php/$1last;}/?
