Skip to content

nginx基础 #10

@wxqweb

Description

@wxqweb

由于公司内部系统对IE浏览器的兼容不太友好,所以直接就放弃IE了,毕竟微软自己也求大家别用IE了,所以就搞了个页面提示用户升级浏览器。我们公司没有运维,所以就自己来配置了nginx, 顺便学习了一下nginx rewrite规则的一些基础知识。

判断IE浏览器并提示

配置实例:

server {
  listen 80;
  server_name xxx.xxx.com;
  root   /www;
  if ( $http_user_agent ~* "MSIE") {
    rewrite /* /download.html break;
  }
}

解释一下上面的配置:

  • $http_user_agent 客户端agent信息(这个是浏览器的标识,如果你开了访问日志的话,可以去看一下。每种浏览器的标识可能都不一样。)

  • ~* 使用正则表达式,并且不区分大小写

  • MSIE MSIE-IE浏览器的标识,这里匹配的是IE浏览器所有版本

  • rewrite /* /download.html break 只要匹配则返回指定的静态页面

  • break 停止执行当前这一轮的ngx_http_rewrite_module指令集

nginx全局变量

  • $args #这个变量等于请求行中的参数。
  • $content_length #请求头中的Content-length字段。
  • $content_type #请求头中的Content-Type字段。
  • $document_root #当前请求在root指令中指定的值。
  • $host #请求主机头字段,否则为服务器名称。
  • $http_user_agent #客户端agent信息
  • $http_cookie #客户端cookie信息
  • $limit_rate #这个变量可以限制连接速率。
  • $request_body_file #客户端请求主体信息的临时文件名。
  • $request_method #客户端请求的动作,通常为GET或POST。
  • $remote_addr #客户端的IP地址。
  • $remote_port #客户端的端口。
  • $remote_user #已经经过Auth Basic Module验证的用户名。
  • $request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
  • $query_string #与$args相同。
  • $scheme #HTTP方法(如http,https)。
  • $server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
  • $server_name #服务器名称。
  • $server_port #请求到达服务器的端口号。
  • $request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
  • $uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
  • $document_uri #与$uri相同。

nginx 重写 rewrite 基础

  • 大小写匹配
  1. ~ 为区分大小写匹配
  2. ~* 为不区分大小写匹配
  3. !和!*分别为区分大小写不匹配及不区分大小写不匹配
  • 文件及目录匹配
  1. -f和!-f用来判断是否存在文件
  2. -d和!-d用来判断是否存在目录
  3. -e和!-e用来判断是否存在文件或目录
  4. -x和!-x用来判断文件是否可执行
  • flag标记
  1. last 相当于Apache里的[L]标记,表示完成rewrite
  2. break 终止匹配, 不再匹配后面的规则。
  3. redirect 返回302临时重定向 地址栏会显示跳转后的地址。
  4. permanent 返回301永久重定向 地址栏会显示跳转后的地址。
  • logcation的使用实例
  1. location / { }:匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
  2. location =/ {}:仅仅匹配/
  3. location ~* .(gif|jpg|jpeg)$ { rewrite .(gif|jpg)$ /logo.png;} : location不区分大小写,匹配任何以gif,jpg,jpeg结尾的文件。

其他实例

  1. 多目录转成参数
    要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

规则配置:

if ($host ~* (.*)\.domain\.com) { 
    set $sub_name $1;
    rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last; 
} 
  1. 目录对换
    要求:/123456/xxxx -> /xxxx?id=123456

规则配置:

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last; 
  1. 给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; 
} 

  1. 设定某个文件的浏览器缓存过期时间;这里为600秒,并不记录访问日志
location ^~ /html/scripts/loadhead_1.js { 
    access_log off; 
    expires 600; 
    break; 
} 

  1. Nginx还可以自定义某一类型的文件的保质期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
  if (-f $request_filename) {
    expires    1h;
    break;
    }
}

# 上段代码就将js|css|jpg|jpeg|gif|png|swf这类文件的保质期设置为一小时。
  1. 防盗链的设置:
    防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式,具体代码如下:
location ~* \.(gif|jpg|swf)$ {
  valid_referers none blocked start.igrow.cn sta.igrow.cn;
  if ($invalid_referer) {
  rewrite ^/ http://$host/logo.png;
  }
}
  1. 只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行
location \ { 
  allow 22.27.164.25; #允许的ipd
  deny all; 
  auth_basic “KEY”; #认证的一些设置
  auth_basic_user_file htpasswd; 
}
# 说明:location的应用也有各种变化,这里的写法就针对了根目录了。

  1. 文件和目录不存在的时重定向
if (!-e $request_filename) { 
  #proxy_pass http://127.0.0.1; #这里是跳转到代理ip,这个代理ip上有一个监听的web服务器
  rewrite ^/ http://www.jjonline.cn/none.html;  #跳转到这个网页去
  #return 404; #直接返回404码,然后会寻找root指定的404.html文件
} 
  1. 域名跳转
server { 
  listen 80; 
  server_name jump.jjonline.cn ;#需要跳转的多级域名
  index index.html index.htm index.php; #入口索引文件的名字
  root /var/www/public_html/; #这个站点的根目录
  rewrite ^/ http://www.jjonline.cn/; 
  #rewrite到这个地址,功能表现:在浏览器上输入jump.jjonline.cn并回车,不会有任何提示直接变成www.jjonline.cn
  access_log off; 
} 
  1. 多域名转向
server { 
  listen 80; 

  server_name www.jjonline.cn www.jjonline.org;
  index index.html index.htm index.php; 
  root /var/www/public_html/; 
  if ($host ~ “jjonline\.org”) { 
      rewrite ^(.*) http://www.jjonline.cn$1 permanent; 
  } 
}

  1. 三级域名跳转
if ($http_host ~* “^(.*)\.i\.jjonline\.cn$”) { 
    rewrite ^(.*) http://demo.jjonline.cn$1; 
    break; 
} 
  1. 域名镜向
server { 
  listen 80; 
  server_name mirror.jjonline.cn; 
  index index.html index.htm index.php; 
  root /var/www/public_html; 
  rewrite ^/(.*) http://www.jjonline.cn/$1 last; 
  access_log off; 
} 

  1. 某个子目录作镜向,这里的示例是demo子目录
location ^~ /demo { 
    rewrite ^.+ http://demo.jjonline.cn/ last; 
    break; 
}

参考文章:http://m.111cn.net/art-88454.htm

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions