Rewrite压缩功能依赖于ngx_http_upstream_module模块,是nginx提供重定向服务的重要功能之一。

if指令

if (condition) {...}

  • 如果变量的值为空字符串或以0开头的任意字符串,if指令认为条件为false,其他情况认为true
  • 使用=!=来比较变量和字符串是否相等,这里的字符串不需要加引号。
if ($request_method = POST) {
    return 405;
}
  • 正则表达式之间使用~,~*,!~,!~*连接
  • ~:对大小写敏感
  • ~*:对大小写敏感
  • !~!~*:匹配失败时,认为是true
  • 在正则表达式中,可以使用小括号对变量进行截取,在花括号中使用$1 $2引用截取的值。
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    # 这里有了$1和$2两个变量
}
  • 判断请求的文件是否存在,可以使用-f!-f来判断
  • 判断请求的目录是否存在,可以用-d!-d来判断。当使用!-d时,如果请求的目录不存在,但是该目录的上级目录存在,if指令认为条件为true,如果该目录和上级目录都不存在,则为flase,如果目录存在,也为false。
  • 判断请求的文件或目录是否存在使用-e!-e判断,用法见-f

break指令

  • 用于中断当前作用域中其他nginx的配置。
  • return直接向客户端返回响应状态码

rewrite指令

rewrite regex replacement [flag]

  • 其中flag的取值为last,break,redirect,permanent的其中一个。
  • last:终止继续在本location块中处理接收到的URLI,并将此重写的URI作为一个新的URI,使用各location块进行处理。
  • break:将此处重写的URI作为一个新的URI,在本块中继续进行处理。该标志将重写后的地址在当前的location块中执行,不会将新的URI转向其他的location块。
  • redirect:将重写的URI返回给客户端,状态代码为302。
  • permanent:将重写后的URI返回给客户端,状态代码为301。

rewrite域名跳转

server {
    # 域名跳转
    listen 80;
    server_name jump.myweb.name;
    rewrite ^/ http://www.myweb.info/;
}

server {
    # 多域名跳转
    listen 80;
    server_name jump.myweb.name jump.myweb.info;
    if ($host ~ myweb\.info) {
        rewrite ^(.*) http://jump.myweb.name$1 permanent;
    }
}

server {
    #三级域名跳转
    listen 80;
    server_name jump1.myweb.name jump2.myweb.name;
    if ($http_host ~* ^(.*)\.myweb\.name$) {
        rewrite ^(.*) http://jump.myweb.name$1;
        break;
    }
}

域名镜像

server {
    listen 80;
    server_name mirror1.myweb.name;
    rewrite ^(.*) http://jump1.myweb.name$1 last;
}

server {
    listen 81;
    server_name mirror2.myweb.name;
    rewrite ^(.*) http://jump2.myweb.name$1 last;
}

防盗链

server {
    listen 80;
    server_name www.myweb.name;
    location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
        valid_referers none blocked server_name *.myweb.name;
        if ($invalid_referer) {
            rewrite ^/ http://www.myweb.com/images/forbidden.png;
            # return 403
        }
    }
}

server {
    listen 80;
    server_name www.myweb.name;
    location /file/ {
        root /server/file/;
        valid_referers none blocked server_names *. myweb.name;
        if ($invalid_referer) {
            rewrite ^/ http://www.myweb.com/images/forbidden.png;
            # return 403
        }
    }
}