Nginx地址重写 Nginx rewrite

rewrite语法规则
1).变量名可以使用 "=" 或 "!=" 运算符
~ 区分大小写
~* 不区分大小写
^~ 禁止表达式匹配 找到后就不向下找了
= 精确匹配
!~ 和 !~* 与 ~ !~ 相反
-f 和 !-f 用来判断文件是否存在
-d 和 !-d 用来判断目录是否存在
-e 和 !-e 用来判断文件或目录是否存在
-x 和 !-x 用来判断文件是否可以执行
也支持$1到$9位置化参数

1.if指令
规则语法
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}

# 请求的文件不存在,就指定到指定的路径URL下
if(!-f $request_filename){
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
}

2.return 指令
示例:如果访问url以 *.sh 或 *.bash结尾,则返回状态码403
location ~ .*\.(sh|bash)?${
return 403;
}

3.set,rewrite指令
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'){ # 如果这个值为不1就转到下面的地址
rewrite ^/(.*)$ http://www.aaa.com redirect;
}
}

4.rewrite指令
rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种
last 相当于Apache里的[L]标记,表示完成rewrite;
break 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

last和break用来实现URI重写,浏览器地址栏URL地址不变
redirect和permanent来用实现URL跳转,浏览器地址栏会显示跳转后的URL地址

例:
location /cms/{
proxy_pass http://test.abc.com;
rewrite "^/cms/(.*)\.html$" /cms/index.html break;
}
注: 一般在跟location中(即location /{...}) 或直接在server标签中编写rewrite规则,推荐使用last标记,在非跟location中(location /cms/{...}),则使用break标记

实例:
1.将原来要访问/data目录重写为/bbs
rewrite ^/data/?$ /bbs/ permanent;

2.根据不同的浏览器将得到不同的结果
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}

3.防止盗链
location ~* \.(gif|jpg|png|swf|flv)${
valid_referers none blocked www.test.com *.test.com;
if($invalid_referer){
rewrite ^/(.*) http://www.test.com/block.html;
}
}

4.实现域名跳转
所有对www.abc.com的访问,redirect到www.test.com
server{
listen 80;
server_name www.test.com
index index.html index.php;
root /var/home/www;
if($host="www.abc.com"){
rewrite "^/(.*)$" http://www.test.com/$1 permanent;
}
}

5.URL rewrite和反向代理同时进行
location /news/{
proxy_pass http://www.news.com;
}
location /sports/{
proxy_pass http://www.sports.com;
}

-----------------------------------------------------------------------
全局变量
$args 此变量与请求行中的参数相等

$content_length 等于请求行的“Content_Length”的值。

$content_type 等同与请求头部的”Content_Type”的值

$document_root 等同于当前请求的root指令指定的值

$document_uri 与$uri一样

$host 与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样

$limit_rate 允许限制的连接速率

$request_method 等同于request的method,通常是“GET”或“POST”

$remote_addr 客户端ip

$remote_port 客户端port

$remote_user 等同于用户名,由ngx_http_auth_basic_module认证

$request_filename 当前请求的文件的路径名,由root或alias和URI request组合而成

$request_body_file

$request_uri 含有参数的完整的初始URI

$query_string 与$args一样

$server_protocol 等同于request的协议,使用“HTTP/1.0”或“HTTP/1.1”

$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。

$server_name 请求到达的服务器名

$server_port 请求到达的服务器的端口号

$uri 等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

-----------------------------------------------------------------------

Nginx日志管理
log_format
$http_x_forwarded_for和$remote_user用于记录ip地址
$remote_user 用来记录远程客户端用户名称
$time_local 用来记录访问时间及时区
$request 用于记录请求的URL与HTTP协议
$status 用于记录请求的状态,如200 404等
$body_bytes_sent 用于记录发送给客户端的文件主体内容大小
$http_referer 用于记录是从哪个页面链接访问过来的
$http_user_agent 用记记录客户端浏览器的相关信息

定义日志
access_log /data/log/$server_name.log mylogformat buffer=32k
注:从0.7.4之后nginx支持变量
buffer=32k 表示设置内存缓冲区的大小

开启日志打开缓存
为了提高包含变量的日志文件存放路径的性能,可以使用open_log_file_cache指令来设置.
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] |off

该指令默认是禁止的,等同于:
open_log_file_cache off;
max 设置缓存中的最大文件描述符数量
inactive 设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符
min_uses 在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符计入缓存,默认为10秒钟
valid 设置多长时间检查 1 次,看日志文件路径与文件名是否仍然存在,默认60秒
例:
最大记录1000个文件缓存
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

Nginx日志分割
vi /data/logs.sh
#! /bin/bash
#Nginx日志存放位置
logs_path="/data/logs/";
#将日志改名
mkdir -p ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/access_$(date -d "yesterday"+"%Y%m%d").log
#重启nginx服务
pkill -USR1 nginx

# 创建计划任务
crontab -e
01 00 * * */bin/bash /data/logs.sh

Nginx开启压缩输出
在http{...}中间,启用压缩
#vi /etc/nginx.conf
gzip on;
gzip_min_length 1k;
gzip_buffer 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_type text/plain application/x-javascript text/css application/xml;
gzip_vary on;

Nginx的浏览器本地缓存设置

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
#设置图片在客户端缓存时间为 30days
location ~ .*\.(js|css)?$
{
expires 1h;
}

Nginx设定限速
location /download{
limit_rate 256k;
proxy_pass http://www.abc.com;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /movie{
limit_rate_after 10m;
limit_rate 100k;
}
if($http_user_agent ~ Google|Yahoo|baidu){
limit_rate 20k;
}

Nginx设置反向代理
http{
以下参数说明:中的选项
}

参数说明:
# 允许客户端请求的最大的单个文件字节数
client_max_body_size 300m;

#缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;

#跟后端服务器连接的超时时间 发到握手等候响应超时时间
proxy_connent_timeout 600;

#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
proxy_read_timeout 600;

#后端服务器数据回传时间,就是在规定的时间内后端服务器必须传完所有的数据
proxy_send_timeout 600;

#代理请求缓存去,该缓存去间保存用户的头信息,以供nginx进行规则处理一般只要保能保存下头信息即可
proxy_buffer_size 16k;

#告诉nginx保存单个用的几个buffer 最大用多少空间
proxy_buffers 4 64k;

#高负载下缓冲大小(proxy_buffers*2)[如果系统很忙的时候可以申请更的proxy_buffers]
proxy_busy_buffers_size 128k;

#proxy缓存临时文件的大小 设置缓存文件夹大小,如果大于该值,将从upstream 服务器传递请求,而不缓冲到磁盘上
proxy_temp_file_write_size 1024m;

proxy_temp_path /data/proxy_temp_path;
proxy_cache_path /data/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=1g;


location /sms{
proxy_pass http://192.168.1.2;
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_set_header X-Forwarded-For $remote_addr;
}

#具体代理缓存的内容
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html)$
{
proxy_cache cache_one;
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid any 1m;
#以域名,URI 参数组合成web缓存的key值, Nginx根据key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://192.168.3.2;
}

----------------------------------------------------------------
location ~ .*\.(php|jsp|cgi|asp|aspx|flv|swf|xml)?$ #列出的扩展名文件不缓存。

{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://osyunweihost;
}
access_log off;
}

location ~ /purge(/.*) #用于清除缓存
{
allow 127.0.0.1;
allow 192.168.21.0/24; #设置只允许指定的IP或IP段才可以清除URL缓存。
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

Nginx_地址重写(rewrite)_日志管理(log_format)_压缩输出_Nginx设定限速_Nginx设置反向代理及反向代理缓存的更多相关文章

  1. BZOJ_4196_[NOI2015]_软件包管理器_(树链剖分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4196 给出一棵树,树上点权为0或1.u权值为1的条件是从根节点到u路径上的所有点权值都为1.u ...

  2. 将商户后台_门店管理后台_平台后台管理v1.0 Axure RP项目上传到svn服务器步骤

  3. nginx 日志管理配置详解

    nginx的日志管理 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$statu ...

  4. Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解

    文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...

  5. Apache rewrite地址重写

    Apache-rewrite+13个经典案例Apache 重写规则的常见应用(rewrite)一:目的 如何用Apache重写规则来解决一些常见的URL重写方法的问题,通过常见的 实例给用户一些使用重 ...

  6. nginx反向代理,负载均衡,动静分离,rewrite地址重写介绍

    一.rewrite地址重写 地址转发后客户端浏览器地址栏中的地址显示是不变的,而地址重写后地址栏中的地址会变成正确的地址. 在一次地址转发过程中只会产生一次网络请求,而一次地址重写产生两次请求. 地址 ...

  7. IIS:URL Rewrite实现vue的地址重写

    vue-router 全局配置 const router = new VueRouter({ mode: 'history', routes: [...] }) URL Rewrite 1.添加规则 ...

  8. 循序渐进nginx(三):日志管理、http限流、https配置,http_rewrite模块,第三方模块安装,结语

    目录 日志管理 access_log error_log 日志文件切割 自定义错误页 http访问限流 限制请求数 语法 使用 限制连接数 语法 测试 补充: https配置 使用 生成证书 配置ng ...

  9. php url地址重写

    地址重写: urlRewrite: 就是:  1. 将php的地址index.php不写只写Action模块和function方法, 或者 2. php地址转变成html地址, 就是一种假的html, ...

随机推荐

  1. eclipse template里面的${user}更改

    打开eclipse目录下的eclipse.ini文件,添加上一行 -Duser.name="whateveryouwant" 这样在eclipse中的${user}变量的值就变成了 ...

  2. Redis安装及基本配置

    一.Redis介绍 1.Redis是一个key-value存储系统 2.官方站点http://redis.io 3.Redis和Memcached类似,但支持数据持久化 4.支持更多value类型,除 ...

  3. 第3章 rpm命令管理

    3-1 RPM包命名规则 3-2 安装命令 3-3 升级与卸载 3-4 RPM包查询 3-5 RPM包校验

  4. POJ Girls and Boys (最大独立点集)

                                                                Girls and Boys Time Limit: 5000MS   Memo ...

  5. Python字符串操作

    isalnum()判断是否都是有效字符串 >>> ev1 = 'evilxr' >>> ev2 = 'ev1il2xr3' >>> ev3 = ' ...

  6. Spring源码学习之:你不知道的spring注入方式

    前言 在Spring配置文件中使用XML文件进行配置,实际上是让Spring执行了相应的代码,例如: 使用<bean>元素,实际上是让Spring执行无参或有参构造器 使用<prop ...

  7. VC++ MFC橡皮筋技术

    在MFC下绘制直线,使用橡皮筋技术,可以使直线效果跟随鼠标移动 //OnLButtionDown        m_ptOrigin = m_ptEnd = point;  //OnMouseMove ...

  8. 防止 SQL 注入的方法(摘抄)

    ——选自<深入Ajax : 架构与最佳实践 = Advanced Ajax : architecture and best practices/ (美)Shawn M.Lauriat著:张过,宋 ...

  9. NetHogs下载和监控

    转自:http://blog.csdn.net/testcs_dn/article/details/40506225 CentOS6.5下使用NetHogs监控进程网络使用情况 分类: CentOS2 ...

  10. 使用Ef时,对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

    EntityValidationErrors   关于如何查看 EntityValidationErrors 详细信息的解决方法 我们在 EF 的编程中,有时候会遇到这样一个错误: 但是,按照他的提示 ...