nginx地址截断

地址截断

使用location上的路径

location 中的 root 和 alias

  • root 指令只是将搜索的根设置为 root 设定的目录,即不会截断 uri,而是使用原始 uri 跳转该目录下查找文件
  • aias 指令则会截断匹配的 uri,然后使用 alias 设定的路径加上剩余的 uri 作为子路径进行查找

示例 1:root

1
2
3
4
5
6
7
8
9
10
11
12
13
#------------目录结构----------
/www/x1/index.html
/www/x2/index.html

#--------配置-----------------------
index index.html index.php;
location /x/ {
root "/www/";
}

#-------访问--------------
curl http://localhost/x1/index.html
curl http://localhost/x2/index.html

示例 2:alias

1
2
3
4
5
6
7
#----------配置-----------------
location /y/z/ {
alias /www/x1/;
}

#---------访问--------------
curl http://localhost/y/z/index.html

location 中的 proxy_pass 的 uri

如果 proxy_pass 的 url 不带 uri

如果尾部是”/“,则会截断匹配的uri

如果尾部不是”/“,则不会截断匹配的uri

如果proxy_pass的url带uri,则会截断匹配的uri

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#-------servers配置--------------------
location / {
echo $uri #回显请求的uri
}

#--------proxy_pass配置---------------------
location /t1/ { proxy_pass http://servers; } #正常,不截断
location /t2/ { proxy_pass http://servers/; } #正常,截断
location /t3 { proxy_pass http://servers; } #正常,不截断
location /t4 { proxy_pass http://servers/; } #正常,截断
location /t5/ { proxy_pass http://servers/test/; } #正常,截断
location /t6/ { proxy_pass http://servers/test; } #缺"/",截断
location /t7 { proxy_pass http://servers/test/; } #含"//",截断
location /t8 { proxy_pass http://servers/test; } #正常,截断
#---------访问----------------------
for i in $(seq 6)
do
url=http://localhost/t$i/doc/index.html
echo "-----------$url-----------"
curl url
done

#--------结果---------------------------
----------http://localhost:8080/t1/doc/index.html------------
/t1/doc/index.html

----------http://localhost:8080/t2/doc/index.html------------
/doc/index.html

----------http://localhost:8080/t3/doc/index.html------------
/t3/doc/index.html

----------http://localhost:8080/t4/doc/index.html------------
/doc/index.html

----------http://localhost:8080/t5/doc/index.html------------
/test/doc/index.html

----------http://localhost:8080/t6/doc/index.html------------
/testdoc/index.html

----------http://localhost:8080/t7/doc/index.html------------
/test//doc/index.html

----------http://localhost:8080/t8/doc/index.html------------
/test/doc/index.html

正则判断

比如,http://baidu.com/sina/search/hello.com

我想截取sina后面的路径作为代理,就可以这么写

1
2
3
4
5
6
7
location ^~ /sina/{
if ($request_uri ~ /sina/(.+))
{
set $rightUrl $1;
}
proxy_pass http://127.0.0.1:8080/$rightUrl;
}

假设你想截取两个字符串之间的字符,可以这么写

我想截取(http://baidu.com/test/AcenterB)A和B之间的字符:

1
2
3
4
5
6
7
location ^~ /test/{
if ($request_uri ~ A(.*?)B )
{
set $center $1;
}
proxy_pass http://127.0.0.1:8080/$center;
}

location语法规则

​ location [=||*|^~|@] /uri/ { … }

location分为两个部分

第一个部分

​ [=||*|^~|@]

​ = : 表示精确匹配后面的url
​ ~ : 表示正则匹配,但是区分大小写
* : 正则匹配,不区分大小写
​ ^
: 表示普通字符匹配,如果该选项匹配,只匹配该选项.不匹配别的选项,一般用来匹配目录
​ @ : “@” 定义一个命名的 location,使用在内部定向时,例如 error_page

  = 是精确完整匹配, 且优先级最高
 正则匹配时,如果 ~ 和 ^~ 同时匹配规则,则 ^~ 优先
  ^~ 这个不会匹配请求url中后面的路径, 如上面的 /test/hello 没有匹配上
 ^~ 不支持正则,和=相比,范围更广, hellowo 是可以被^~匹配,但是 = 不会匹配
 ~ 路径中只要包含就可以匹配,如上面的 /test/hellowo 返回了602

第二个部分

/uri/ 这里主要填的就是需要匹配的path路径,根据前面的符号,这里可以填写精确的path路径.也可以填正则表达式,下面则主要针对正则进行说明

​ . : 匹配除换行符以外的任意字符
​ ? : 重复0次或1次
​ + : 重复1次或更多次
​ * : 重复0次或更多次
​ \d :匹配数字
​ ^ : 匹配字符串的开始
​ $ : 匹配字符串的介绍
​ {n} : 重复n次
​ {n,} : 重复n次或更多次
​ [c] : 匹配单个字符c
​ [a-z] : 匹配a-z小写字母的任意一个
​ 小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容.正则里面容易让人困惑的是\转义特殊字符。


nginx地址截断
http://hanqichuan.com/2023/05/30/nginx/nginx地址截断/
作者
韩启川
发布于
2023年5月30日
许可协议