Nginx重写功能(Rewrite)由ngx_http_rewrite_module模块提供,可使用正则表达式改变请求的URI,返回重定向地址或内容,并可以根据条件选择适当的配置。
Rewrite指令格式
关键字 正则表达式 代替的内容 重写类型
rewrite regex replacement [flag]
flag 说明
- last:本条重写规则匹配完成后,终止匹配后续重写规则,并重新发起请求继续匹配新的location URI规则;浏览器地址栏URL地址不变
特殊说明
last:终止继续在本location块中处理接收到的URI,并将此处重写的URI作为一个新的URI,使用各location块进行处理。
last标志将重写后的URI重新在server块中执行,为重写后的URI提供了转入到其它location块的机会,如下面的就导致死循环了:location /myweb/{ rewrite ^(/myweb/.*)/media/(.*)\..*$ myweb/$1/mp3/$2.mp3 last; }
因为使用last,相当于一个新请求进来,再重新走一遍location。重写后的URI会被该location块重新匹配到
Nginx服务器遇到这种情况,会尝试10次循环之后返回错误状态代码500 - break:本条重写规则匹配完成后,终止匹配后续重写规则; 浏览器地址栏URL地址不变
- redirect:返回302临时重定向,浏览器地址会显示重写后的URL地址
- permanent:返回301永久重定向,浏览器地址会显示重写后的URL地址
在配置文件中定义变量
示例
if ($query_string ~* ^(.*)url=(.*)$){
set $imageUrl $2;
proxy_pass $imageUrl;
}
nginx 各参数翻译,作用
$arg_PARAMETER | 这个变量包含GET请求中,如果有变量PARAMETER时的值。 |
---|---|
$args | 这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah; |
$binary_remote_addr | 二进制的客户地址。 |
$body_bytes_sent | 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。 |
$content_length | 请求头中的Content-length字段。 |
$content_type | 请求头中的Content-Type字段。 |
$cookie_COOKIE | cookie COOKIE变量的值 |
$document_root | 当前请求在root指令中指定的值。 |
$document_uri | 与$uri相同。 |
$host | 请求主机头字段,否则为服务器名称。 |
$hostname | Set to the machine’s hostname as returned by gethostname |
$http_HEADER | 访问HTTP请求头中的信息,其中HEADER应替换为实际的HTTP头字段名称,且所有的字母都转换为大写。例如,要获取User-Agent头部的内容,你应该使用$http_user_agent |
$is_args | 如果有$args参数,这个变量等于”?”,否则等于”",空值。 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 这个变量可以限制连接速率。 |
$query_string | 与$args相同。 |
$request_body_file | 客户端请求主体信息的临时文件名。 |
$request_method | 客户端请求的动作,通常为GET或POST。 |
$remote_addr | 客户端的IP地址。 |
$remote_port | 客户端的端口。 |
$remote_user | 已经经过Auth Basic Module验证的用户名。 |
$request_completion | 如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。 |
$request_method | GET或POST |
$request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成。 |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。 |
$scheme | HTTP方法(如http,https)。 |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值。 |
$server_name | 服务器名称。 |
$server_port | 请求到达服务器的端口号。 |
$uri | 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。该值有可能和$request_uri 不一致。$request_uri是浏览器发过来的值。该值是rewrite后的值。例如做了internal redirects后。 |