1、Rewrite规则的主要作用是实现URL的重写。使用场景有:
(1)、使用MVC框架的程序只有一个入口;
(2)、动态URL伪装成静态HTML,便于搜索引擎抓取,也需要Rewrite规则
(3)、目录结构或者域名变化的旧URL,须要跳转到新的URL,也需要Rewrite规则
2、nginx有以下内置变量
$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$1 redirect;
$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$server_port, 请求到达的服务器端口号;
$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
这些变量可以用在rewrite规则里,也可以打印日志的时候用
3、Nginx Rewrite规则相关指令
Nginx Rewrite规则相关指令有 if、 rewrite、set、return、break等,其中rewrite是最关键的指令。
(1)break指令:使用环境 server、location、if,作用是完成当前的规则集,不再处理rewrite指令。
(2)if指令 :使用环境server、location,不支持嵌套,不支持多个条件 && 和 || 处理。if指令可以有的条件形式:
(1)变量名,错误的值包括:空字符串“”,或者任何以0开始的字符串。
(2)变量比较可以使用=(等于)或者 !=(不等于)运算符。
(3)正则表达式模式匹配可以使用 ~ 或者 ~*
~表示区分大小写字母的匹配; ~*表示不区分大小写字母的匹配(如 firefox和Firefox)
!~表示区分大小写字母的不匹配;!~* 表示不区分大小写字母的不匹配
(4)-f 和 !-f 表示判断文件是否存在;
(5)-d 和 !-d 表示判断目录是否存在;
(6)-e 和 !-e 表示判断文件或目录是否存在;
(7)-x 和 !-x 表示判断文件是否可执行;
以下配置?不懂语法
if ( $http_user_agent ~MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^ ;]) +") (? : ; | $)" ) {
set $id $1;
}
if ($args ^~ post=140){
rewrite ^ http://example.com/permanent;
}
// 如果访问的URL以 “.SH” 和“.Bash”结尾,则返回状态码403
location ~ .*\. (sh | bash) ? ${
return 403;
}
(3)rewrite指令:使用环境server 、location、if,该指令根据表达式重定向URI,或者修改字符串。重写表达式只是对于相对路径有效。
rewrite指令的最后一项参数为flag标记,支持的flag标记有:
last--相当于apache里面的【L】标记,表示完成rewrite;
break--本条规则匹配完成后,终止匹配,不再匹配后面的规则;
redirect--返回302临时重定向,浏览器地址会显示跳转后的URL地址;
permanent--返回301永久重定向,浏览器地址会显示跳转后的URL地址;
注意:
a、 last和 break用来实现URI重写,浏览器地址栏的URL不变,但在服务器端访问的路径发生了变化。使用alias指令时候必须使用last标记,使用proxy_pass时候必须使用break标记;last标记会在匹配执行完本条规则后,继续对其所在的server标签重新发起请求。break则不会匹配本条规则之后的其他规则,会终止匹配。
b、redirect和permanent用来实现URL的跳转,浏览器地址会显示跳转后的URL地址。
建议一般在根location或者server中使用last,在非根location中则使用break;location/{}是根location, location /cms/..{}是非根location.
允许指定的域名访问本站,其他域名一律跳转:
允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com 。 nginx语法如下:
if( $host ~* ^(.*?)\.aaa\.com$){ set $var_tz '1'}
if( $host ~* ^192\.168\.1\.(.*?)$) { set $var_tz '1'}
if( $host ~* ^localhost){ set $var_tz '1'}
if( $var_tz !~ '1'){ rewrite ^/(.*)$ http://www.aaa.com/ redirect;}
4、Location 基本语法:
(1)location [ =|~|~*|^~|@ ] /uri/ { … }
〖=〗 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
〖~ 〗 表示区分大小写匹配
〖~*〗 表示不区分大小写匹配
〖^~ 〗 表示只匹配字符串,不查询正则表达式。
〖@〗 指定一个命名的location,一般只用于内部重定向请求。
匹配过程
首先对字符串进行匹配查询,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配第一个结果后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果,如果字符串和正则都匹配,那么正则优先级较高。(2)location配置实例:
location = / {
# 只匹配对 / 目录的查询.
[ config A ]
}
location / {
# 匹配以 / 开始的查询,即所有查询都匹配。
[ config B ]
}
location ^~ /images/ {
# 匹配以 /images/ 开始的查询,不再检查正则表达式。
[ config C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以gif, jpg, or jpeg结尾的文件,但优先级低于config C。
[ config D ]
}在Java正则表达式中,^表示开头,$表示结尾。此处,$表示结尾, .表示任意。
(3)Location配置实例
禁止ht access
location ~/\.ht {
1. #ht是一个文件或目录,无论ht在哪一级,都禁止访问)
2. deny all;
3. }
禁止多个目录
1. location ~ ^/(cron|templates)/ {
2. #禁止访问第一级目录中名为cron或templates的目录
3. deny all;
4. break;
5. }
禁止以/data开头的文件
可以禁止/data目录下所有文件的访问;
1. location ~ ^/data {
2. deny all;
3. }
禁止单个文件
1. location ~ /data/sql/data.sql {
2. deny all;
3. }
5、Pcre正则表达式语法
a.*b 贪婪模式
a.*?b懒惰模式:匹配最短的,以a开头以b结尾的字符串(子串)