https://nginx.org/en/docs/http/ngx_http_core_module.html#location
Nginx的location
指令工作原理如下:
~*
修饰符)或区分大小写的(~
修饰符)。^~
修饰符:如果具有最长匹配前缀的位置具有此修饰符,则不会检查正则表达式。=
修饰符:定义URI和位置的精确匹配。一旦找到,搜索终止。@
前缀:为请求重定向定义了一个命名位置,而不是用于常规请求处理。不能嵌套,也不能包含嵌套位置。~
:执行区分大小写的正则表达式匹配。~*
:执行不区分大小写的正则表达式匹配。^~
:执行普通字符匹配,不是正则表达式。如果匹配成功,只使用该选项,不再匹配其他选项,通常用于匹配目录。=
:执行精确匹配,即普通字符的精确匹配。@
:定义一个命名的location,用于内部重定向,例如error_page
,try_files
。=
)优先级最高。如果找到精确匹配,Nginx停止搜索其他匹配。^~
,则只匹配该规则,Nginx停止搜索其他匹配;否则,Nginx会继续处理其他location
指令。这些规则确保了location
指令的匹配行为,并使得开发者能够有序地控制请求的路由和处理。
proxy_pass
)处理,则如果请求的URI没有尾部斜杠,则执行永久重定向(301)。以下是基于提供的配置的示例:
location = / {
[ 配置 A ]
}
location / {
[ 配置 B ]
}
location /documents/ {
[ 配置 C ]
}
location ^~ /images/ {
[ 配置 D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ 配置 E ]
}
特殊处理的示例:
location /user/ {
proxy_pass http://user.example.com;
}
location = /user {
proxy_pass http://login.example.com;
}
http://user.example.com
。http://login.example.com
。server {
listen 127.0.0.1:80;
set $test A;
set $testB B;
location / {
if ($test ~* "A") {
proxy_pass http://www.so.com;
break;
}
if ($testB ~* "B") {
proxy_pass http://www.sogou.com;
#break;
}
}
}
当希望根据不同的条件执行不同的proxy_pass
时,可以使用多个if
指令。例如,在上述配置中,如果多个条件都满足,比如在第一个if
中没有使用break
,那么下一个条件也会被执行。为了确保匹配到第一个条件后就执行相应的proxy_pass
,可以在第一个if
指令中加上break
关键字。(在Nginx中没有if-else
这样的结构)
在这种情况下,可以使用多个if语句来满足不同条件下的处理逻辑。但需要注意的是,if语句是在Nginx的rewrite模块中执行的,并且在性能方面可能会有一些影响。另外,需要小心使用if语句,因为它们可能会引起一些意想不到的问题
location / {
root html;
index index.html index.htm index.php;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Connection "";
if ( $query_string ~* "usg=0" ) {
proxy_pass http://local_workera;
}
if ( $query_string ~* "usg=1" ) {
proxy_pass http://local_workerb;
}
if ( $arg_uid ~* "(.*[AB]$)" ) {
proxy_pass http://local_workerf;
}
proxy_pass http://local_workera;
}
usg=0
和 usg=1
这两个参数是固定的,因此可以使用 $query_string
进行正则匹配。usg=0
和 usg=1
这两个参数是互斥的,因此放在 location
块的顶部即可正确处理。而对于 uid
的匹配,则应放在最底部或者使用 break
关键字,以避免与 usg
参数的匹配冲突。对于固定参数值,可以使用query_string进行正则匹配,而对于变量参数值,则需要使用arg_parameter进行匹配。对于可能互斥的参数匹配条件,确保按照正确的优先级进行排列,或者在适当的地方使用break来终止后续的if语句执行