Nginx rewrite 与内置参数

Nginx重写功能(Rewrite)由ngx_http_rewrite_module模块提供,可使用正则表达式改变请求的URI,返回重定向地址或内容,并可以根据条件选择适当的配置。

Rewrite指令格式

关键字 正则表达式 代替的内容 重写类型
rewrite regex replacement [flag]

flag 说明

  1. 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

  2. break:本条重写规则匹配完成后,终止匹配后续重写规则; 浏览器地址栏URL地址不变
  3. redirect:返回302临时重定向,浏览器地址会显示重写后的URL地址
  4. 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后。