nginx location 匹配怎么匹配参数

博客分类:
location:http核心模块
语法:location [=|~|~*|^~|@] /uri/ { ... } 默认值:no 使用字段:server 这个参数根据URI的不同需求来进行配置,可以使用字符串与正则表达式匹配,如果要使用正则表达式,你必须指定下列前缀:1、~* 不区分大小写。2、~ 区分大小写。要确定该指令匹配特定的查询,程序将首先对字符串进行匹配,字符串匹配将作为查询的开始,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配查询的第一个正则表达式找到后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果。在一些操作系统,如Mac OS X和Cygwin,字符串将通过不区分大小写的方式完成匹配(0.7.7),但是,比较仅限于单字节的语言环境。正则表达式可以包含捕获(0.7.40),并用于其它指令中。可以使用“^~”标记禁止在字符串匹配后检查正则表达式,如果最确切的匹配location有这个标记,那么正则表达式不会被检查。使用“=”标记可以在URI和location之间定义精确的匹配,在精确匹配完成后并不进行额外的搜索,例如有请求“/”发生,则可以使用“location = /”来加速这个处理。即使没有“=”和“^~”标记,精确的匹配location在找到后同样会停止查询。
下面是各种查询方式的总结:1、前缀“=”表示精确匹配查询,如果找到,立即停止查询。2、指令仍然使用标准字符串,如果匹配使用“^~”前缀,停止查询。3、正则表达式按照他们在配置文件中定义的顺序。4、如果第三条产生一个匹配,这个匹配将被使用,否则将使用第二条的匹配。
# 只匹配 / 的查询.
[ configuration A ]
# 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。
[ configuration B ]
location ^~ /images/ {
# 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
[ configuration C ]
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处理。
[ configuration D ]
各请求的处理如下例:·/ -& configuration A ·/documents/document.html -& configuration B ·/images/1.gif -& configuration C ·/documents/1.jpg -& configuratio
注意你可以以任何顺序定义这4个配置并且匹配结果是相同的,但当使用嵌套的location结构时可能会将配置文件变的复杂并且产生一些比较意外的结果。
expires:http头处理模块
语法:expires [time|@time-of-day|epoch|max|off] 默认值:expires off 使用字段:http, server, location 这个指令控制是否在应答中标记一个过期时间,如果是,如何标记。·off 将禁止修改头部中的 Expires和Cache-Control字段。·epoch 将Expires头设置为1 January, :01 GMT。·max 将Expires头设置为31 December :59 GMT,将Cache-Control最大化到10 years。·如果将指令设置为一个不带@标记的值,那么过期时间将是应答时间的相对时间(如果这个时间在“modified”之前),或者是文件的修改时间(当"modified"存在,在版本0.7.0和0.6.32可用),并且可以指定一个负的时间,它将Cache-Control头设置为no-cache比较。·如果指令的值被设置为一个带@标记的值,那么将指定一个绝对的time-of-day过期时间,可以指定两种格式分别为Hh或Hh:Mm,其中H的大小范围为0到24,M的大小范围为0到59(在0.7.9和0.6.34可用)。一个非负的时间值将Cache-Control头设置为 max-age = #,#将适当的换算为秒数。注意:expires仅仅适用于200, 204, 301, 302,和304应答
重要补充内容:
URL重写模块
语法:break默认值:none使用字段:server, location, if 完成当前设置的规则,停止执行其他的重写指令。
语法:if (condition) { ... } 默认值:none使用字段:server, location 判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承。可以在判断语句中指定下列值:
·一个变量的名称;不成立的值为:空字符传""或者一些用“0”开始的字符串。·一个使用=或者!=运算符的比较语句。·使用符号~*和~模式匹配的正则表达式:·~为区分大小写的匹配。·~*不区分大小写的匹配(firefox匹配FireFox)。·!~和!~*意为“不匹配的”。·使用-f和!-f检查一个文件是否存在。·使用-d和!-d检查一个目录是否存在。·使用-e和!-e检查一个文件,目录或者软链接是否存在。 ·使用-x和!-x检查一个文件是否为可执行文件。
语法:return code 默认值:none使用字段:server, location, if 这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非标准代码444将关闭连接并且不发送任何的头部。
语法:rewrite regex replacement flag 默认值:none使用字段:server, location, if 按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。注意重写规则只匹配相对路径而不是绝对的URL,如果想匹配主机名,可以加一个if判断,如:
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 # $1为'/foo',而不是'/foo'
可以在重写指令后面添加标记。如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。标记可以是以下的值:
·last - 完成重写指令,之后搜索相应的URI或location。·break - 完成重写指令。·redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。·permanent - 返回301永久重定向。
浏览 25233
home198979
浏览: 908049 次
来自: 深圳
浏览量:55375
浏览量:30937
浏览量:47157
不一定哦,就算大小相当,in 和 exists的性能也会很大差 ...
[size=x-small][/size]
q 写道还是佩服写c的用其它语言一样可以实现 ...
还是佩服写c的
不错啊,强
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Nginx 配置 location 总结及 rewrite 规则写法_服务器应用_Linux公社-Linux系统门户网站
你好,游客
Nginx 配置 location 总结及 rewrite 规则写法
作者:Linux
1. location正则写法
一个示例:
location =/{
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
location /{
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
location /documents/{
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
location ~/documents/Abc{
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
location ^~/images/{
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
location /images/{
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
location ~/images/abc/{
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
location ~*/js/.*/\.js
已=开头表示精确匹配如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~&开头表示uri以某个常规字符串开头,不是正则匹配
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到
顺序不等于优先级:
(location =) & (location 完整路径) & (location ^~ 路径) & (location ~,~* 正则顺序) & (location 部分起始路径) & (/)
上面的匹配结果。按照上面的location写法,以下的匹配示例成立:
/ -& config A精确完全匹配,即使/index.html也匹配不了
/downloads/download.html -& config B匹配B以后,往下没有任何匹配,采用B
/images/1.gif -& configuration D匹配到F,往下匹配到D,停止往下
/images/abc/def -& config D最长匹配到G,往下匹配D,停止往下你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
/documents/document.html -& config C匹配到C,往下没有任何匹配,采用C
/documents/1.jpg -& configuration E匹配到C,往下正则匹配到E
/documents/Abc.jpg -& config CC最长匹配到C,往下正则顺序匹配到CC,不会往下到E
实际使用建议
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location =/{
proxy_pass http://tomcat:8080/index
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~/static/{
root /webroot/static/;
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location /{
proxy_pass http://tomcat:8080/
2. Rewrite规则
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如/a/we/index.php?id=1&u=str&只对/a/we/index.php重写。语法rewrite regex replacement [flag];
如果相对域名或???数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。
表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
执行server块的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。
2.1 flag标志位
last&: 相当于Apache的[L]标记,表示完成rewrite
break&: 停止执行当前虚拟主机的后续rewrite指令集
redirect&: 返回302临时重定向,地址栏会显示跳转后的地址
permanent&: 返回301永久重定向,地址栏会显示跳转后的地址
因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewrite指令
2.2 if指令与全局变量
if判断指令
语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
直接比较变量和内容时,使用=或!=
~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
-f和!-f用来判断是否存在文件-d和!-d用来判断是否存在目录-e和!-e用来判断是否存在文件或目录-x和!-x用来判断文件是否可执行
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}//如果UA包含"MSIE",rewrite请求到/msid/目录下
if($http_cookie ~*"id=([^;]+)(?:;|$)"){
set $id $1;
}//如果cookie匹配正则,设置变量$id等于正则引用部分
if($request_method = POST){
return405;
}//如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
if($slow){
limit_rate 10k;
}//限速,$slow可以通过 set 指令设置
if(!-f $request_filename){
proxy_pass http://127.0.0.1;
}//如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
if($args ~ post=140){
rewrite ^ http:///
}//如果query string中包含"post=140",永久重定向到
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.leizhenfang.com;
if($invalid_referer){
return404;
下面是可以用作if判断的全局变量
$args&: #这个变量等于请求行中的参数,同$query_string
$content_length&: 请求头中的Content-length字段。
$content_type&: 请求头中的Content-Type字段。
$document_root&: 当前请求在root指令中指定的值。
$host&: 请求主机头字段,否则为服务器名称。
$http_user_agent&: 客户端agent信息
$http_cookie&: 客户端cookie信息
$limit_rate&: 这个变量可以限制连接速率。
$request_method&: 客户端请求的动作,通常为GET或POST。
$remote_addr&: 客户端的IP地址。
$remote_port&: 客户端的端口。
$remote_user&: 已经经过Auth Basic Module验证的用户名。
$request_filename&: 当前请求的文件路径,由root或alias指令与URI请求生成。
$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相同。
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
2.3 常用正则
.&: 匹配除换行符以外的任意字符
?&: 重复0次或1次
+&: 重复1次或更多次
*&: 重复0次或更多次
\d&:匹配数字
^&: 匹配字符串的开始
$&: 匹配字符串的介绍
{n}&: 重复n次
{n,}&: 重复n次或更多次
[c]&: 匹配单个字符c
[a-z]&: 匹配a-z小写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
2.4 rewrite实例
# 定义image日志格式
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
# 开启重写日志
rewrite_log on;
root /home/www;
location /{
# 重写规则信息
error_log logs/rewrite.log notice;
# 注意这里要用&&单引号引起来,避免{}
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$'/data?file=$3.$4;
# 注意不能在上面这条规则后面加上&last&参数,否则下面的set指令不会执行
set $image_file $3;
set $image_type $4;
location /data {
# 指定针对图片的日志格式,来分析图片类型和大小
access_log logs/images.log mian;
root /data/images;
# 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
try_files /$arg_file /image404.html;
location =/image404.html {
# 图片不存在返回特定的信息
return404"image not found\n";
对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3?last;
对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。
6.2实战部署Nginx+MySQL+PHP
使用Nginx搭建WEB服务器
搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程
CentOS 6.3下Nginx性能调优
CentOS 6.3下配置Nginx加载ngx_pagespeed模块
CentOS 6.4安装配置Nginx+Pcre+php-fpm
Nginx安装配置使用详细笔记
Nginx日志过滤 使用ngx_log_if不记录特定日志
Nginx 的详细介绍:Nginx 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款推荐这篇日记的豆列
&&&&&&&&&&&&你的位置: >
> nginx反向代理ngx_http_proxy_module模块重要参数详解
ngx_http_proxy_module模块详情可以查看官方文档http://nginx.org/en/docs/http/ngx_http_proxy_module.html 。如下是过来的,特此笔记一下:
ngx_http_proxy_module 作用:ngx_http_proxy_module 模块允许传送请求到其它服务器。
location / {
proxy_pass
http://localhost:8000;
proxy_set_header Host
proxy_set_header X-Real-IP $remote_
其中 ngx_http_proxy_module模块所有指令包含如下:
我们这里只针对一些重要参数和常用参数这里说明下,其他的可以自行参考官网:
1,proxy_buffer_size
语法: proxy_buffer_
proxy_buffer_size 4k|8k;
上下文: http, server, location
设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于proxy_buffers指令设置的一块缓冲区的大小,但它也可以被设置得更小。
2,proxy_buffering
语法: proxy_buffering on |
上下文: http, server, location
代理的时候,开启或关闭缓冲后端服务器的响应。
当开启缓冲时,nginx尽可能快地从被代理的服务器接收响应,再将它存入proxy_buffer_size和proxy_buffers指令设置的缓冲区中。如果响应无法整个纳入内存,那么其中一部分将存入磁盘上的临时文件。proxy_max_temp_file_size和proxy_temp_file_write_size指令可以控制临时文件的写入。
当关闭缓冲时,收到响应后,nginx立即将其同步传给客户端。nginx不会尝试从被代理的服务器读取整个请求,而是将proxy_buffer_size指令设定的大小作为一次读取的最大长度。
响应头“X-Accel-Buffering”传递“yes”或“no”可以动态地开启或关闭代理的缓冲功能。 这个能力可以通过proxy_ignore_headers指令关闭。
3, proxy_buffers number size
语法: proxy_
proxy_buffers 8 4k|8k;
上下文: http, server, location
为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。
4,proxy_busy_buffers_size
语法: proxy_busy_buffers_
proxy_busy_buffers_size 8k|16k;
上下文: http, server, location
当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍。
语法: proxy_cache zone |
上下文: http, server, location
指定用于页面缓存的共享内存。同一块共享内存可以在多个地方使用。off参数可以屏蔽从上层配置继承的缓存功能。
语法: proxy_cache_bypass string …;
默认值: —
上下文: http, server, location
定义nginx不从缓存取响应的条件。如果至少一个字符串条件非空而且非“0”,nginx就不会从缓存中去取响应:
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_
proxy_cache_bypass $http_pragma $http_
本指令可和与proxy_no_cache一起使用。
语法: proxy_cache_
proxy_cache_key $scheme$proxy_host$request_
上下文: http, server, location
定义如何生成缓存的键,比如
proxy_cache_key “$host$request_uri $cookie_user”;
这条指令的默认值类似于下面字符串
proxy_cache_key $scheme$proxy_host$uri$is_args$
语法: proxy_cache_lock on |
proxy_cache_
上下文: http, server, location
这个指令出现在版本 1.1.12.
开启此功能时,对于相同的请求,同时只允许一个请求发往后端,并根据proxy_cache_key指令的设置在缓存中植入一个新条目。 其他请求相同条目的请求将一直等待,直到缓存中出现相应的内容,或者锁在proxy_cache_lock_timeout指令设置的超时后被释放。
语法: proxy_cache_lock_
proxy_cache_lock_timeout 5s;
上下文: http, server, location
这个指令出现在版本 1.1.12.
为proxy_cache_lock指令设置锁的超时。
语法: proxy_cache_min_
proxy_cache_min_uses 1;
上下文: http, server, location
设置响应被缓存的最小请求次数。
语法: proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time];
默认值: —
上下文: http
设置缓存的路径和其他参数。缓存数据是保存在文件中的,缓存的键和文件名都是在代理URL上执行MD5的结果。 levels参数定义了缓存的层次结构。比如,下面配置
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
缓存中文件名看起来是这样的:
/data/nginx/cache/c/29/b7f54b2dffc
被缓存的响应首先写入一个临时文件,然后进行重命名。从0.8.9版本开始,临时文件和缓存可以放在不同的文件系统。但请注意,这将导致文件在这两个文件系统中进行拷贝,而不是廉价的重命名操作。因此,针对任何路径,都建议将缓存和proxy_temp_path指令设置的临时文件目录放在同一文件系统。
此外,所有活动的键和缓存数据相关的信息都被存放在共享内存中。共享内存通过keys_zone参数的name和size来定义。被缓存的数据如果在inactive参数指定的时间内未被访问,就会被从缓存中移除,不论它是否是刚产生的。inactive的默认值是10分钟。
特殊进程“cache manager”监控缓存的条目数量,如果超过max_size参数设置的最大值,使用LRU算法移除缓存数据。
nginx新启动后不就,特殊进程“cache loader”就被启动。该进程将文件系统上保存的过去缓存的数据的相关信息重新加载到共享内存。加载过程分多次迭代完成,每次迭代,进程只加载不多于loader_files参数指定的文件数量(默认值为100)。此外,每次迭代过程的持续时间不能超过loader_threshold参数的值(默认200毫秒)。每次迭代之间,nginx的暂停时间由loader_sleep参数指定(默认50毫秒)。
语法: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off …;
proxy_cache_use_
上下文: http, server, location
如果后端服务器出现状况,nginx是可以使用过期的响应缓存的。这条指令就是定义何种条件下允许开启此机制。这条指令的参数与proxy_next_upstream指令的参数相同。
此外,updating参数允许nginx在正在更新缓存的情况下使用过期的缓存作为响应。这样做可以使更新缓存数据时,访问源服务器的次数最少。
在植入新的缓存条目时,如果想使访问源服务器的次数最少,可以使用proxy_cache_lock指令。
语法: proxy_cache_valid [code …]
默认值: —
上下文: http, server, location
为不同的响应状态码设置不同的缓存时间。比如,下面指令
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
设置状态码为200和302的响应的缓存时间为10分钟,状态码为404的响应的缓存时间为1分钟。
如果仅仅指定了time,
proxy_cache_valid 5m;
那么只有状态码为200、300和302的响应会被缓存。
如果使用了any参数,那么就可以缓存任何响应:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
缓存参数也可以直接在响应头中设定。这种方式的优先级高于使用这条指令设置缓存时间。 “X-Accel-Expires”响应头可以以秒为单位设置响应的缓存时间,如果值为0,表示禁止缓存响应,如果值以@开始,表示自日以来的秒数,响应一直会被缓存到这个绝对时间点。 如果不含“X-Accel-Expires”响应头,缓存参数仍可能被“Expires”或者“Cache-Control”响应头设置。 如果响应头含有“Set-Cookie”,响应将不能被缓存。 这些头的处理过程可以使用指令proxy_ignore_headers忽略。
语法: proxy_connect_timeout time;
proxy_connect_timeout 60s;
上下文: http, server, location
设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。
语法: proxy_cookie_
proxy_cookie_domai
proxy_cookie_
上下文: http, server, location
这个指令出现在版本 1.1.15.
设置“Set-Cookie”响应头中的domain属性的替换文本。 假设后端服务器返回的“Set-Cookie”响应头含有属性“domain=localhost”,那么指令
proxy_cookie_domain localhost example.
将这个属性改写为“domain=example.org”。
domain和replacement配置字符串,以及domain属性中起始的点将被忽略。 匹配过程大小写不敏感。
domain和replacement配置字符串中可以包含变量:
proxy_cookie_domain www.$host $
这条指令同样可以使用正则表达式。这时,domain应以“~”标志开始,且可以使用命名匹配组和位置匹配组,而replacement可以引用这些匹配组:
proxy_cookie_domain ~\.(?P&sl_domain&[-0-9a-z]+\.[a-z]+)$ $sl_
可以同时定义多条proxy_cookie_domain指令:
proxy_cookie_domain localhost example.
proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;
off参数可以取消当前配置级别的所有proxy_cookie_domain指令:
proxy_cookie_
proxy_cookie_domain localhost example.
proxy_cookie_domain www.example.org example.
语法: proxy_cookie_
proxy_cookie_p
proxy_cookie_
上下文: http, server, location
这个指令出现在版本 1.1.15.
设置“Set-Cookie”响应头中的path属性的替换文本。 假设后端服务器返回的“Set-Cookie”响应头含有属性“path=/two/some/uri/”,那么指令
proxy_cookie_path /two/ /;
将这个属性改写为“path=/some/uri/”。
path和replacement配置字符串可以包含变量:
proxy_cookie_path $uri /some$
这条指令同样可以使用正则表达式。如果使用大小写敏感的匹配,path应以“~”标志开始,如果使用大小写不敏感的匹配,path应以“~*”标志开始。path可以使用命名匹配组和位置匹配组,replacement可以引用这些匹配组:
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
可以同时定义多条proxy_cookie_path指令:
proxy_cookie_path /one/ /;
proxy_cookie_path / /two/;
off参数可以取消当前配置级别的所有proxy_cookie_path指令:
proxy_cookie_
proxy_cookie_path /two/ /;
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
语法: proxy_hide_
默认值: —
上下文: http, server, location
nginx默认不会将“Date”、“Server”、“X-Pad”,和“X-Accel-…”响应头发送给客户端。proxy_hide_header指令则可以设置额外的响应头,这些响应头也不会发送给客户端。相反的,如果希望允许传递某些响应头给客户端,可以使用proxy_pass_header指令。
语法: proxy_http_version 1.0 | 1.1;
proxy_http_version 1.0;
上下文: http, server, location
这个指令出现在版本 1.1.4.
设置代理使用的HTTP协议版本。默认使用的版本是1.0,而1.1版本则推荐在使用keepalive连接时一起使用。
语法: proxy_ignore_client_abort on |
proxy_ignore_client_
上下文: http, server, location
决定当客户端在响应传输完成前就关闭连接时,nginx是否应关闭后端连接。
语法: proxy_ignore_headers field …;
默认值: —
上下文: http, server, location
不处理后端服务器返回的指定响应头。下面的响应头可以被设置: “X-Accel-Redirect”,“X-Accel-Expires”,“X-Accel-Limit-Rate” (1.1.6),“X-Accel-Buffering” (1.1.6), “X-Accel-Charset” (1.1.6),“Expires”,“Cache-Control”,和“Set-Cookie” (0.8.44)。
如果不被取消,这些头部的处理可能产生下面结果:
“X-Accel-Expires”,“Expires”,“Cache-Control”,和“Set-Cookie” 设置响应缓存的参数;
“X-Accel-Redirect”执行到指定URI的内部跳转;
“X-Accel-Limit-Rate”设置响应到客户端的传输速率限制;
“X-Accel-Buffering”启动或者关闭响应缓冲;
“X-Accel-Charset”设置响应所需的字符集。
语法: proxy_intercept_errors on |
proxy_intercept_
上下文: http, server, location
当后端服务器的响应状态码大于等于400时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。
语法: proxy_max_temp_file_
proxy_max_temp_file_size 1024m;
上下文: http, server, location
打开响应缓冲以后,如果整个响应不能存放在proxy_buffer_size和proxy_buffers指令设置的缓冲区内,部分响应可以存放在临时文件中。 这条指令可以设置临时文件的最大容量。而每次写入临时文件的数据量则由proxy_temp_file_write_size指令定义。
将此值设置为0将禁止响应写入临时文件。
语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off …;
proxy_next_up
上下文: http, server, location
指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:
和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误;
和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时;
invalid_header
后端服务器返回空响应或者非法响应头;
后端服务器返回的响应状态码为500;
后端服务器返回的响应状态码为502;
后端服务器返回的响应状态码为503;
后端服务器返回的响应状态码为504;
后端服务器返回的响应状态码为404;
停止将请求发送给下一台后端服务器。
需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。
语法: proxy_no_cache string …;
默认值: —
上下文: http, server, location
定义nginx不将响应写入缓存的条件。如果至少一个字符串条件非空而且非“0”,nginx就不将响应存入缓存:
proxy_no_cache $cookie_nocache $arg_nocache$arg_
proxy_no_cache $http_pragma $http_
这条指令可以和proxy_cache_bypass指令一起使用。
语法: proxy_pass URL;
默认值: —
上下文: location, if in location, limit_except
设置后端服务器的协议和地址,还可以设置可选的URI以定义本地路径和后端服务器的映射关系。 这条指令可以设置的协议是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可选)的形式来定义:
proxy_pass http://localhost:8000/uri/;
又可以使用UNIX域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如:
proxy_pass http://unix:/tmp/backend.socket:/uri/;
如果解析一个域名得到多个地址,所有的地址都会以轮转的方式被使用。当然,也可以使用服务器组来定义地址。
请求URI按下面规则传送给后端服务器:
如果proxy_pass使用了URI,当传送请求到后端服务器时,规范化以后的请求路径与配置中的路径的匹配部分将被替换为指令中定义的URI:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
如果proxy_pass没有使用URI,传送到后端服务器的请求URI一般客户端发起的原始URI,如果nginx改变了请求URI,则传送的URI是nginx改变以后完整的规范化URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
在1.1.12版以前,如果proxy_pass没有使用URI,某些情况下,nginx改变URI以后,会错误地将原始URI而不是改变以后的URI发送到后端服务器。
某些情况下,无法确定请求URI中应该被替换的部分:
使用正则表达式定义路径。
这种情况下,指令不应该使用URI。
在需要代理的路径中,使用rewrite指令改变了URI,但仍使用相同配置处理请求(break):
location /name/ {
rewrite /name/([^/]+) /users?name=$1
proxy_pass http://127.0.0.1;
这种情况下,本指令设置的URI会被忽略,改变后的URI将被发送给后端服务器。
后端服务器的地址,端口和URI中都可以使用变量:
proxy_pass http://$host$
甚至像这样:
proxy_pass $
这种情况下,后端服务器的地址将会在定义的服务器组中查找。如果查找不到,nginx使用resolver来查找该地址。
语法: proxy_pass_
默认值: —
上下文: http, server, location
允许传送被屏蔽的后端服务器响应头到客户端。
语法: proxy_read_timeout time;
proxy_read_timeout 60s;
上下文: http, server, location
定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。
语法: proxy_
proxy_redirect
上下文: http, server, location
设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。 假设后端服务器返回的响应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将把字符串改写为 “Location: http://frontend/one/some/uri/”。
replacement字符串可以省略服务器名:
proxy_redirect http://localhost:8000/two/ /;
此时将使用代理服务器的主域名和端口号来替换。如果端口是80,可以不加。
用default参数指定的默认替换使用了location和proxy_pass指令的参数。因此,下面两例配置等价:
location /one/ {
proxy_pass http://upstream:port/two/;
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
而且因为同样的原因,proxy_pass指令使用变量时,不允许本指令使用default参数。
replacement字符串可以包含变量:
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
而redirect字符串从1.1.11版本开始也可以包含变量:
proxy_redirect http://$proxy_host:8000/ /;
同时,从1.1.11版本开始,指令支持正则表达式。使用正则表达式的话,如果是大小写敏感的匹配,redirect以“~”作为开始,如果是大小写不敏感的匹配,redirect以“~*”作为开始。而且redirect的正则表达式中可以包含命名匹配组和位置匹配组,而在replacement中可以引用这些匹配组的值:
proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
proxy_redirect ~*/user/([^/]+)/(.+)$ http://$/$2;
除此以外,可以同时定义多个proxy_redirect指令:
proxy_redirect http://localhost:8000/ /;
proxy_redirect / /;
另外,off参数可以使所有相同配置级别的proxy_redirect指令无效:
proxy_redirect http://localhost:8000/ /;
proxy_redirect / /;
最后,使用这条指令也可以为地址为相对地址的重定向添加域名:
proxy_redirect / /;
语法: proxy_send_timeout time;
proxy_send_timeout 60s;
上下文: http, server, location
定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。
语法: proxy_set_
proxy_set_header Host $proxy_
proxy_set_header C
上下文: http, server, location
允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:
proxy_set_header Host $proxy_
proxy_set_header C
如果不想改变请求头“Host”的值,可以这样来设置:
proxy_set_header Host $http_
但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,更好的方式是使用$host变量——它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:
proxy_set_header Host $
此外,服务器名可以和后端服务器的端口一起传送:
proxy_set_header Host $host:$proxy_
如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding “”;
语法: proxy_ssl_session_reuse on |
proxy_ssl_session_
上下文: http, server, location
决定是否重用与后端服务器的SSL会话。如果日志中出现“SSL3_GET_FINISHED:digest check failed”错误,请尝试关闭会话重用。
语法: proxy_store on | off |
上下文: http, server, location
开启将文件保存到磁盘上的功能。如果设置为on,nginx将文件保存在alias指令或root指令设置的路径中。如果设置为off,nginx将关闭文件保存的功能。此外,保存的文件名也可以使用含变量的string参数来指定:
proxy_store /data/www$original_
保存文件的修改时间根据接收到的“Last-Modified”响应头来设置。响应都是先写到临时文件,然后进行重命名来生成的。从0.8.9版本开始,临时文件和持久化存储可以放在不同的文件系统,但是需要注意这时文件执行的是在两个文件系统间拷贝操作,而不是廉价的重命名操作。因此建议保存文件的路径和proxy_temp_path指令设置的临时文件的路径在同一个文件系统中。
这条指令可以用于创建静态无更改文件的本地拷贝,比如:
location /images/ {
root /data/
open_file_cache_
error_page 404 = /fetch$
location /fetch/ {
proxy_pass http://backend/;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/
alias /data/www/;
或者像这样:
location /images/ {
root /data/
error_page 404 = @
location @fetch {
proxy_pass http://
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /data/
root /data/
语法: proxy_store_access users:permissions …;
proxy_store_access user:
上下文: http, server, location
设置新创建的文件和目录的访问权限,比如:
proxy_store_access user:rw group:rw all:r;
如果指定了任何group或者all的访问权限,那么可以略去user的访问权限:
proxy_store_access group:rw all:r;
语法: proxy_temp_file_write_
proxy_temp_file_write_size 8k|16k;
上下文: http, server, location
在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的size(大小)限制。 size的默认值是proxy_buffer_size指令和proxy_buffers指令定义的每块缓冲区大小的两倍, 而临时文件最大容量由proxy_max_temp_file_size指令设置。
语法: proxy_temp_path path [level1 [level2 [level3]]];
proxy_temp_path proxy_
上下文: http, server, location
定义从后端服务器接收的临时文件的存放路径,可以为临时文件路径定义至多三层子目录的目录树。 比如,下面配置
proxy_temp_path /spool/nginx/proxy_temp 1 2;
那么临时文件的路径看起来会是这样:
/spool/nginx/proxy_temp/7/45/
ngx_http_proxy_module支持内嵌变量,可以用于在proxy_set_header指令中构造请求头:
$proxy_host
后端服务器的主机名和端口;
$proxy_port
后端服务器的端口;
$proxy_add_x_forwarded_for
将$remote_addr变量值添加在客户端“X-Forwarded-For”请求头的后面,并以逗号分隔。 如果客户端请求未携带“X-Forwarded-For”请求头,$proxy_add_x_forwarded_for变量值将与$remote_addr变量相同。
翻译: cfsego
转载请注明: &
与本文相关的文章}

我要回帖

更多关于 location 匹配参数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信