💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
更多参考上面Nginx相关->nginx.config配置文件的结构->2、http->nginx的location配置详解 ## **全局变量** $args : 请求参数,同$query_string $content_length : 请求头中的Content-length字段。 $content_type : 请求头中的Content-Type字段。 $document_root : 当前请求在root指令中指定的值(结尾不带斜杠, 不论配置中server->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,如”/foo/bar.html”。 $document_uri : 与$uri相同。 ## **flag 标志位** **flag可以是如下参数:** **`last`** 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。相当于Apache的[L]标记 **`break`** 出现在server, location, if段中,完成当前设置的重写规则,停止执行其他的重写规则,即停止处理后续rewrite指令集,并不再重新查找, 但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。 **`redirect`** 如果replacement不是以"http://" 或 "https://" 开头,返回302临时重定向,地址栏会显示跳转后的地址 **`permant`** 返回301永久重定向,地址栏会显示跳转后的地址 **last 和 break的区别:** * last一般写在server{}和if{}段中,而break一般使用在location{}段中; 相当于Apache的【L】标记,表示完成rewrite * last 和 break 当出现在 location{} 之外时,两者的作用是一致的没有任何差异; 注意一点就是,他们会跳过所有的在他们之后的 rewrite 模块中的指令,去选择自己匹配的 location{} * last 和 break 当出现在location{} 内部时,两者就存在了差异: * last 指令: rewrite 后会跳出 location{} 作用域,重新开始再走一次刚刚的行为。 * break 指令: rewrite后不会跳出 location{} 作用域。它的生命也在这个location{}中终结。 * **通俗易懂的说法:** * **last**:重新将rewrite后的地址在server标签中执行 * **break**:将`rewrite`后的地址在当前`location`标签中执行 ## **if指令** 语法:`if (condition){...}` 作用域:`server`,`location` `conditon`可以是如下任何内容: * 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做 (bool)false * 直接比较变量和内容时,使用 = 或 != * 正则表达式匹配:~(区分大小写)和~*(不区分大小写),取反运算!~和!~\*. 如果这个正则表达式中包含} , ;则整个表达式需要用双引号" 或 单引号' 包围 * -f 和 !-f 用来判断**是否存在**文件.(当-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) { return 405; } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302 if ($slow) { limit_rate 10k; } //限速,$slow可以通过 set 指令设置 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break会停止rewrite检查 if ($args ~ post=140){ rewrite ^ http://example.com/ permanent; } //如果query string中包含"post=140",永久重定向到example.com location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.com www.leizhenfang.com; if ($invalid_referer) { return 404; } //防盗链 } 优先级结论 (location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /) ``` 我们在set后面写业务逻辑去匹配uri, 当匹配之后$full_file_path变量会被重新设置非空字符串; 如果不匹配, 则仍然是空字符串. 而经过测试, 对于空字符串变量, -f时会忽略, 但是!-f时不会忽略, 导致直接返回了404. 而其他不符合这个业务逻辑的请求就会遭到误杀. 正则匹配 `.` : 匹配除换行符以外的任意字符 `?` : 重复0次或1次 `+` : 重复1次或更多次 `*` : 重复0次或更多次 `{n}` : 重复n次 `{n,}` : 重复n次或更多次 `\d` :匹配数字 `^` : 匹配字符串的开始 `$` : 匹配字符串的结尾 `[c]` : 匹配单个字符c `[a-zA-Z0-9]` : 匹配a-z小写字母,A-Z大写字母, 数字0-9 中的任意一个 `(jpg|png)` : 匹配字符串 jpg 或 png , 括号表示分组 ## **Rewrite语法** ~~~css rewrite < regex > < replacement > [flag] regex:正则表达式 replacement :跳转后的内容 flag:rewrite支持的flag标记 ~~~ Rewrite实际场景 ~~~undefined 使用rewrite进行匹配跳转(防盗链) 使用if匹配全局变量后跳转 使用location匹配再跳转(匹配的访问 路径URL location可以匹配本地的重写以及跨服务器的跳转) ~~~ >[danger]小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容 例子:对形如 /images/ef/202103/test.png 的请求,重写到 /data?file=test.png ``` rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行 set $file_name_without_ext $3; set $file_ext $4; ``` rewrite规则中如果要忽略大小写, 可以使用 (?i) 这个与用"/"开始结尾的javascript/php等语言的reg pattern使用/i是不同的. ``` rewrite ^(.*)_(middle|small)(\.(?i)(jpg|jpeg|png|gif))$ /thumb_fixed.php break; ``` 个规则把 xxx\_middle.jpg, xxx\_middle.JPG, xxx\_small.png, xxx\_small.PNG 这样的图片地址进行了重写 >[danger]请求的URL是给人看的,重写后的URL是给电脑看的。 执行搜索 这个规则的目的是为了执行搜索,搜索URL中包含的关键字。 请求的URL //hqidi.com/search/some-search-keywords 重写后URL //hqidi.com/search.php?p=some-search-keywords 重写规则 rewrite ^/search/(.*)$ /search.php?p=$1?; 用户个人资料页面 大多数运行访问者注册的动态网站都提供一个可以查看个人资料的页面,这个页面的URL包含用户的UID和用户名 请求的URL //hqidi.com/user/47/dige 重写后URL //hqidi.com/user.php?id=47&name=dige 重写规则 rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?; 多个参数 有些网站对字符串参数使用不同的语法,例如 通过斜线“/”来分隔非命名参数 请求的URL //hqidi.com/index.php/param1/param2/param3 重写后URL //hqidi.com/index.php?p1=param1&p2=param2&p3=param3 重写规则 rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?; 类似百科的格式 这种格式特点,一个前缀目录,后跟文章名称 请求的URL //hqidi.com/wiki/some-keywords 重写后URL //hqidi.com/wiki/index.php?title=some-keywords 重写规则 rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?; 论坛 论坛一般用到两个参数,一个话题标识(topic)一个出发点(starting post) 请求的URL //hqidi.com/topic-1234-50-some-keywords.html 重写后URL //hqidi.com/viewtopic.php?topic=1234&start=50 重写规则 rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ viewtopic.php?topic=$1&start=$2?; 新网站的文章 这种URL结构的特点,由一个文章标识符,后跟一个斜线,和一个关键字列表组成。 请求的URL //hqidi.com/88/future 重写后URL //hqidi.com/atricle.php?id=88 重写规则 rewrite ^/([0-9]+)/.*$ /aticle.php?id=$1?;