Nginx配置语法

来自Linux78|wiki

if语句 简介 if是nginx配置文件中的一个语法,可以用if和nginx的变量来匹配一些东西,让匹配的ip或者是访问的页面做某些限制或跳转。

例子 判断转发 情景:需要将固定ip访问的时候,比如内网访问,可以看到一个管理页面,其他ip访问将看到首页 if ( $remote_addr = 192.168.2.148 ) { #匹配访问地址是192.168.2.148的

       set $my_ip 1; #将变量my_ip设置为1

} if ( $my_ip = 1) { #等于1,则访问单独页面

       rewrite ^/(.*)$ /one.html;

} if ( $my_ip != 1) { #若不等于1,则让他访问首页

       rewrite ^/(.*)$ /index.html;

} set变量效果范围 location / {

   set $a "666";
   echo "a: $a" ;

} location /xx {

   echo "a: $a";

} set变量只会在location中进行影响,相当于副本和局部变量 curl http://127.0.0.1/xx a: curl http://127.0.0.1 a: 666 变量的传递 location / {

   set $a "666";
   rewrite ^ /xx ;

} location /xx {

   echo "a: $a";

} 可以看出变量是内部转发到/xx区块,但是变量是传递过去了。不同于301跳转,当前是nginx内部跳转。

curl http://127.0.0.1/xx a: 666 curl http://127.0.0.1 a: 参数 if 不支持 && 或 || 也不支持嵌套。 如果需要利用 && 可以通过设置变量的方式。

正则表达式匹配:

==:等值比较; ~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写; ~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写; !~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写; !~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写; 文件及目录匹配判断: -f, !-f:判断指定的路径是否为存在且为文件; -d, !-d:判断指定的路径是否为存在且为目录; -e, !-e:判断指定的路径是否存在,文件或目录均可; -x, !-x:判断指定路径的文件是否存在且可执行; location语法 语法规则: location [=|~|~*|^~] /uri/ { … } = 表示精确匹配,这个优先级也是最高的 ^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。 nginx 不对 url 做编码,因此请求为 /static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。 ~ 表示区分大小写的正则匹配 ~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写) !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 / 通用匹配,任何请求都会匹配到,默认匹配. 下面讲讲这些语法的一些规则和优先级 多个 location 配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参 考): 优先级=>^~> 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止 匹配,按当前匹配规则处理请求。 访问www.****.com/show 或者 www.****.com/show/ 返回403

 location ~ ^/(show|show/)$ {
    return 403;
 }

Nginx全局变量 参考地址

$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为空字符串 $uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。 $document_uri #同 $uri $document_root #当前请求的文档根目录或别名 $host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名 $hostname #主机名 $https #如果开启了SSL安全模式,值为"on",否则为空字符串。 $binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节 $body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容 $bytes_sent #传输给客户端的字节数 $connection #TCP连接的序列号 $connection_requests #TCP连接当前的请求数量 $content_length #"Content-Length" 请求头字段 $content_type #"Content-Type" 请求头字段 $cookie_name #cookie名称 $limit_rate #用于设置响应的速度限制 $msec #当前的Unix时间戳 $nginx_version #nginx版本 $pid #工作进程的PID $pipe #如果请求来自管道通信,值为"p",否则为"." $proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串 $realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径 $remote_addr #客户端地址 $remote_port #客户端端口 $remote_user #用于HTTP基础认证服务的用户名 $request #代表客户端的请求地址 $request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器 $request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off $request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空 $request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成 $request_length #请求的长度 (包括请求的地址,http请求头和请求主体) $request_method #HTTP请求方法,通常为"GET"或"POST" $request_time #处理客户端请求使用的时间; 从读取客户端的第一个字节开始计时 $request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse" $scheme #请求使用的Web协议,"http" 或 "https" $server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中 $server_name #服务器名 $server_port #服务器端口 $server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1" $status #HTTP响应代码 $time_iso8601 #服务器时间的ISO 8610格式 $time_local #服务器时间(LOG Format 格式) $cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值 $http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可 $http_cookie $http_post $http_referer $http_user_agent $http_x_forwarded_for $sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可 $sent_http_cache_control $sent_http_connection $sent_http_content_type $sent_http_keep_alive $sent_http_last_modified $sent_http_location $sent_http_transfer_encoding 变量 简介 我们使用了标准 ngx_rewrite 模块的 set 配置指令对变量 $a 进行了赋值操作。特别地,我们把字符串 hello world 赋给了它。

Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。

nginx变量只能在同location生效,局部。

配置 这里我们使用第三方 ngx_echo 模块的 echo 配置指令将 $foo 变量的值作为当前请求的响应体输出。

server {

       listen 8080;
       location /test {
           set $foo hello;
           echo "foo: $foo";
       }
   }

curl http://127.0.0.1/test 输出 foo: hello 这里用到了标准模块 ngx_geo 提供的配置指令 geo 来为变量 $dollar 赋予字符串 “$”,这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar 变量就可以了。其实 ngx_geo 模块最常规的用法是根据客户端的 IP 地址对指定的 Nginx 变量进行赋值,这里只是借用它以便“无条件地”对我们的 $dollar 变量赋予“美元符”这个值。

   geo $dollar {
       default "$";
   }
   server {
       listen 8080;
       location /test {
           echo "This is a dollar sign: $dollar";
       }
   }
  1. curl http://127.0.0.1/test
  2. 输出 This is a dollar sign: $

变量要用{}隔开,不然会认为是${firstword}

server {

       listen 8080;
       location /test {
           set $first "hello ";
           echo "${first}world";
       }
   }
  1. curl http://127.0.0.1/test
  2. 输出 hello world

nginx在执行中,先将set都实行一遍,再按echo的顺序echo。

server {

       listen 8080;
       location /test {
           set $a 11;
           echo $a;
           set $a 55;
           echo $a;
       }
   }
  1. curl http://127.0.0.1/test
  2. 输出 55
  3. 55

Nginx_return 简介 return一般用于接收到ip访问或非指定域名访问时会返回指定错误(500)错误,或者用于流量引入至某个网站

配置 重定向

location /test {

   return 301 http:/www.52wiki.cn/

} 返回404页面

location /test {

   return 404

} echo_page 将404页面301跳转到其他主页,用于老的链接跳转到新的页面。

  1. error_page 404 =301 http:/example.com/new/path.html;

找不到则将404转发给后端处理

server {

   location /images/ {
       root /html;
       #这里的设置表示如果文件没有找到,不记录这条日志信息,因为后面的location正确处理了,所以没有必要记录
       open_file_cache_errors off;
       #将404页面转发给后面的location去处理,将$uri也转交给后面
       error_page 404 = /fetch$uri;
   }
   location /fetch/ {
       proxy_pass http://backend/;
   }

}