首页 > 系统相关 >nginx变量

nginx变量

时间:2023-07-20 15:23:05浏览次数:33  
标签:匹配 变量 alias uri nginx location http root

一、配置多个location匹配规则

location ^~ /admin {
    alias /var/www/admin/;
    index regist.html;
}
location / {
       root   /data/html/;
       index  index.html index.html;
}

二、root和alias的区别

root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~

location 块中,root 和alias 指令后的路径最后面,有没有 "/" 的区别如下:
location ^~ /dev-popularize/ { # root 指令中:如果后面没有 "/" 则 dist 这个目录下,必须有 dev-popularize 这个目录,然后你的静态资源文件都在这个目录下 # root /Users/shounaer/dist; # root 指令中:如果后面有 "/" 则 dist 这个目录下,不需要有 dev-popularize 这个目录,你的静态资源文件直接放在dist目录下就行 # root /Users/shounaer/dist/; # alias 指令中:如果后面没有 '/' ,则 dist 目录下,无论有没有dev-popularize 都不行,会报 403。 alias /Users/shounaer/dist; # 最终解析效果为:/Users/shounaer/distindex.html 所以会报 403. # alias 指令中:如果后面有 '/' ,则 dist 目录下,直接放你的静态资源文件就行 # alias /Users/shounaer/dist/; # 最终效果:/Users/shounaer/dist/index.html index index.html; }

三、location语法规则

1、=表示精确匹配,优先级最高,匹配成功后则停止向下搜索。

# 精确匹配,必须是127.0.0.1/
location = / {
  ...
}
# 精确匹配,必须是127.0.0.1/login
location = /login {
  ...
}

2、^=对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写

## 127.0.0.1/static/js.
location ^~ /static/ {
    ...
}

3、~对 uri (可以不是起始字符)做 正则匹配,区分大小写

## 区分大小写,以gif,jpg,js结尾
location ~ \.(gif|jpg|png|js|css)$ {
    ...
}

4、~*对 uri (可以不是起始字符)做 正则匹配,不区分大小写

## 不区分大小写,匹配.png结尾的
location ~* \.png$ {
    ...
}

5、!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配

## 区分大小写,匹配不以.xhtml结尾的
location !~ \.xhtml$ {
    ...
}
location !~* \.xhtml$ {
    ...
}

6、不带符号匹配起始于此字符串的所有uri,区分大小写,字符串匹配

## 什么都可以
location / {
    ...
}

注意:字符串匹配(无论是 ^~ 还是 无符号 匹配),后面表达式必须以 / 开头,否则永远无法匹配到。
  • 精确匹配: = , 后面的表达式中写的是纯字符串
  • 字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串
  • 正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式
匹配顺序
= > ^~ > ~ > ~* > 不带符号

多个字符串匹配同时存在时,谁的表达式中被匹配到的字符越多,就命中谁。
比如:访问: localhost:8080/imgs 时, location ^~ /img {} 不会被命中, location /imgs {} 会被命中。
多个正则匹配同时存在且表达式均满足匹配规则时,谁排在前面,谁先命中,不存在匹配到的字符串长度一说。
如果 ^~ 、 无符号匹配 、 ~ 、 ~* 同时存在,且他们的表达式均满足匹配规则。则按照如下规则命中
先看字符串匹配,被匹配到的字符长度越长,越优先命中;
如果是无符号匹配被命中(被匹配到的字符长度较长),则再去查看正则匹配,如果正则匹配中也有被匹配到的,那么对应的正则匹配被命中,原本命中到的无符号匹配被舍弃。
location @name { ... }
此种方式的location配置,无法通过外网访问,只能通过内网跳转,实现容错的功能。

四、其它

1、第一个必选规则

location = / {
  proxy_pass http://127.0.0.1:3000/
}

2、第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配和后缀匹配,任选其一或搭配使用

location ^~ /static/ {
  root /webroot/static/;
}

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
  root /webroot/res/;
}

3、第三个规则就是通用规则,用来转发动态请求到后端应用服务器

location /api/ {
    proxy_pass http://127.0.0.1:3000/api/
}

五、Rewrite 重定向

last – 表示完成rewrite 
break – 中止Rewirte,不在继续匹配 
redirect – 返回临时重定向的HTTP状态302 
permanent – 返回永久重定向的HTTP状态301 
1、下面是可以用来判断的表达式: 
-f和!-f用来判断是否存在文件 
-d和!-d用来判断是否存在目录 
-e和!-e用来判断是否存在文件或目录 
-x和!-x用来判断文件是否可执行 
2、下面是可以用作判断的全局变量 
例:http://localhost:88/test1/test2/test.php 
$host:localhost 
$server_port:88 
$request_uri:/test1/test2/test.php 
$document_uri:/test1/test2/test.php 
$document_root:D:\nginx/html 
$request_filename:D:\nginx/html/test1/test2/test.php 

六、return 重定向

rewrite 重定向:需要先做正则匹配,然后再给客户端返回新地址进行重定向(做了两步操作)
return 重定向:不需要做正则匹配,直接给客户端返回新地址进行重定向(做了一步操作)

server { 
  listen 80; 
  server_name start.igrow.cn; 
  return 301 https://$host$request_uri;
}

七、if 模块

 // 如果用户设备为IE浏览器的时候,重定向 。如果UA包含"MSIE",rewrite请求到/msid/目录下
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
 
 //如果cookie匹配正则,设置变量$id等于正则引用部分
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}
 
 //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
if ($request_method = POST) {
    return 405;
}

 //限速,$slow可以通过 set 指令设置 
if ($slow) {
    limit_rate 10k;
}
 
//如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
if (!-f $request_filename){
    break;
    proxy_pass http://127.0.0.1;
} 
 
 //如果query string中包含"post=140",永久重定向到example.com
if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
}
 
 //防盗链
location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.lfa.com;
    if ($invalid_referer) {
        return 404;
    }
}

八、防盗链

location ~* \.(gif|jpg|swf)$ { 
  valid_referers none blocked start.igrow.cn sta.igrow.cn; 
  if ($invalid_referer) { 
    rewrite ^/ http://$host/logo.png; 
  } 
}

如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referertrue
语法: valid_referers none | blocked | server_names | string ...;
参数说明:
none: 不允许 “Referer” 来源头部为空的情况
blocked: 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除
server_names: “Referer”来源头部包必须含当前的server_names (当前域名)可以多个
 

九、根据文件类型设置过期时间

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { 
  if (-f $request_filename) { 
    expires 1h; 
    break; 
  } 
} 

十、禁止访问某个目录

location ~* \.(txt|doc)${ 
  root /data/www/wwwroot/linuxtone/test; 
  deny all; 
}

十一、

$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$request_method : 客户端请求的动作,通常为GET或POST。
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri : 不包含请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri : 与$uri相同。
$query_string 
$args : 这个变量等于请求行中的参数,同$query_string
$document_root : 当前请求在root指令中指定的值。
$limit_rate : 这个变量可以限制连接速率。
$request_body_file 
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
  作者:R_X 链接:https://www.jianshu.com/p/403bab8fc34d

 

标签:匹配,变量,alias,uri,nginx,location,http,root
From: https://www.cnblogs.com/hm1825/p/17568527.html

相关文章

  • linux9 互斥锁 死锁 读写锁 条件变量 信号量
    1.linux9day1.线程竞争![01-打印机模型](I:\9day\01-打印机模型.png)2.同步和互斥互斥同一时刻只能一个进程或线程使用多个进程或线程不能同时使用同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特......
  • 关于vue3使用setup语法糖获取不到组件实例内部的变量
    //子组件<template><div>{{count}}</div><template<scriptsetup>import{ref}from'vue'constcount=ref(0)</script>//父组件<template><div><Childref="child"/>......
  • [记]Rust全局变量+多线程
    staticmutGods:f32=0.0;fnmain(){std::thread::spawn(||loop{unsafe{Gods+=1.0;}esleep::s(1);//延时1s});std::thread::spawn(||loop{unsafe{Gods+=0.1;}e......
  • kettle javascript获取变量
    kettlejavascript获取变量在Kettle(也称为PentahoDataIntegration)中,JavaScript是一种非常强大的编程语言,可以用于在ETL过程中执行各种复杂的数据处理和转换任务。JavaScript可以帮助我们访问和操作变量,以及在转换过程中进行条件判断和控制流程。本文将介绍如何在Kettle的JavaScr......
  • jquery变量是否存在
    判断jQuery变量是否存在的流程为了判断一个jQuery变量是否存在,我们可以按照以下步骤进行操作:步骤描述1引入jQuery库2判断jQuery变量是否存在3根据判断结果进行相应的操作接下来,我将逐步解释每个步骤需要做什么,并提供相应的代码。步骤1:引入jQuery库首先,我......
  • win nginx 用include管理多个配置文件,如部署多个web前端程序 配置host域名访问
    当要部署多个web程序时,先将web程序分文件夹到html, 1在conf目录下新建conf-test/test_web.conf内容为:server{ listen80; server_namewebone.com; location/{ roothtml/web1; indexindex.htmlindex.htm; }}server{ listen80; serve......
  • python 变量名为字符串
    如何将字符串作为Python的变量名作为一名经验丰富的开发者,我很高兴能够教会你如何在Python中将字符串用作变量名。这将是你编程之旅中的一个重要技巧,因为它可以帮助你动态地创建和管理变量。整体流程下面是将字符串用作Python变量名的整体流程:步骤描述1定义一个字典......
  • java lambda filter实现元素过滤与变量作用域、生命周期
    最开始只是拿来用,后来调试研究了一下。解释:2传递的是对象,对象中包含keySet变量,每次调用都是这个对象里面的keySet变量。而1每次都是创建了一个新的对象,keySet自然不同,也就不能实现过滤了importjava.util.concurrent.ConcurrentHashMap;importjava.util.function.Fun......
  • awk NR详解!awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS
    NF字段个数,(读取的列数)NR记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始FNR读取文件的记录数(行号),从1开始,新的文件重新从1开始计数FS输入字段分隔符,默认是空格OFS输出字段分隔符默认也是空格RS输入行分隔符,默认为换行符ORS输出行分隔符,默认为换行符NF读取记录的......
  • HTTP请求返回304状态码以及研究nginx中的304
    文章目录1.引出问题2.分析问题3.解决问题4.研究nginx中的3044.1启动服务4.2ETag说明4.3响应头Cache-Control 1.引出问题之前在调试接口时,代码总出现304问题,如下所示:2.分析问题HTTP304:NotModified是什么意思?标准解释是:NotModified客户端有缓......