《实战nginx》第7章-Nginx的Rewrite规则与实践

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结尾的字符串(子串)














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值