由于公司内部系统对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 基础
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !
和!*分别为区分大小写不匹配及不区分大小写不匹配
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
- last 相当于Apache里的[L]标记,表示完成rewrite
- break 终止匹配, 不再匹配后面的规则。
- redirect 返回302临时重定向 地址栏会显示跳转后的地址。
- permanent 返回301永久重定向 地址栏会显示跳转后的地址。
- location / { }:匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
- location =/ {}:仅仅匹配/
- location ~* .(gif|jpg|jpeg)$ { rewrite .(gif|jpg)$ /logo.png;} : location不区分大小写,匹配任何以gif,jpg,jpeg结尾的文件。
其他实例
- 多目录转成参数
要求: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;
}
- 目录对换
要求:/123456/xxxx -> /xxxx?id=123456
规则配置:
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
- 给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;
}
- 设定某个文件的浏览器缓存过期时间;这里为600秒,并不记录访问日志
location ^~ /html/scripts/loadhead_1.js {
access_log off;
expires 600;
break;
}
- Nginx还可以自定义某一类型的文件的保质期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
# 上段代码就将js|css|jpg|jpeg|gif|png|swf这类文件的保质期设置为一小时。
- 防盗链的设置:
防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式,具体代码如下:
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
- 只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行
location \ {
allow 22.27.164.25; #允许的ipd
deny all;
auth_basic “KEY”; #认证的一些设置
auth_basic_user_file htpasswd;
}
# 说明:location的应用也有各种变化,这里的写法就针对了根目录了。
- 文件和目录不存在的时重定向
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文件
}
- 域名跳转
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;
}
- 多域名转向
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;
}
}
- 三级域名跳转
if ($http_host ~* “^(.*)\.i\.jjonline\.cn$”) {
rewrite ^(.*) http://demo.jjonline.cn$1;
break;
}
- 域名镜向
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;
}
- 某个子目录作镜向,这里的示例是demo子目录
location ^~ /demo {
rewrite ^.+ http://demo.jjonline.cn/ last;
break;
}
参考文章:http://m.111cn.net/art-88454.htm
由于公司内部系统对IE浏览器的兼容不太友好,所以直接就放弃IE了,毕竟微软自己也求大家别用IE了,所以就搞了个页面提示用户升级浏览器。我们公司没有运维,所以就自己来配置了nginx, 顺便学习了一下nginx rewrite规则的一些基础知识。
判断IE浏览器并提示
配置实例:
解释一下上面的配置:
$http_user_agent 客户端agent信息(这个是浏览器的标识,如果你开了访问日志的话,可以去看一下。每种浏览器的标识可能都不一样。)
~* 使用正则表达式,并且不区分大小写
MSIE MSIE-IE浏览器的标识,这里匹配的是IE浏览器所有版本
rewrite /* /download.html break 只要匹配则返回指定的静态页面
break 停止执行当前这一轮的ngx_http_rewrite_module指令集
nginx全局变量
nginx 重写 rewrite 基础
和!*分别为区分大小写不匹配及不区分大小写不匹配其他实例
要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
规则配置:
要求:/123456/xxxx -> /xxxx?id=123456
规则配置:
规则配置:
防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式,具体代码如下:
参考文章:http://m.111cn.net/art-88454.htm