推荐答案
在 Nginx 中,location
指令用于匹配请求的 URI,并根据匹配结果决定如何处理请求。location
指令的匹配规则如下:
精确匹配:使用
=
前缀进行精确匹配。例如:location = /exact-match { # 仅匹配 /exact-match }
前缀匹配:使用
^~
前缀进行前缀匹配,且匹配成功后不再进行正则表达式匹配。例如:location ^~ /prefix { # 匹配以 /prefix 开头的 URI }
正则表达式匹配:使用
~
或~*
前缀进行正则表达式匹配。~
表示区分大小写,~*
表示不区分大小写。例如:location ~ \.php$ { # 匹配以 .php 结尾的 URI,区分大小写 }
普通前缀匹配:没有前缀的
location
指令进行普通前缀匹配。例如:location / { # 匹配所有 URI }
匹配优先级:Nginx 会按照以下优先级顺序进行匹配:
- 精确匹配 (
=
) 优先级最高。 - 前缀匹配 (
^~
) 优先级次之。 - 正则表达式匹配 (
~
或~*
) 优先级较低。 - 普通前缀匹配优先级最低。
- 精确匹配 (
本题详细解读
1. 精确匹配 (=
)
精确匹配使用 =
前缀,只有当请求的 URI 与 location
中定义的路径完全一致时,才会匹配成功。精确匹配的优先级最高,一旦匹配成功,Nginx 将立即停止后续的匹配过程。
示例:
location = /exact-match { # 仅匹配 /exact-match }
- 请求
/exact-match
会匹配成功。 - 请求
/exact-match/
或/exact-match/other
不会匹配。
2. 前缀匹配 (^~
)
前缀匹配使用 ^~
前缀,匹配以指定路径开头的 URI。与普通前缀匹配不同,前缀匹配成功后,Nginx 不会继续尝试正则表达式匹配。
示例:
location ^~ /prefix { # 匹配以 /prefix 开头的 URI }
- 请求
/prefix
或/prefix/other
会匹配成功。 - 请求
/prefix-match
不会匹配。
3. 正则表达式匹配 (~
或 ~*
)
正则表达式匹配使用 ~
或 ~*
前缀,~
表示区分大小写,~*
表示不区分大小写。正则表达式匹配的优先级低于精确匹配和前缀匹配。
示例:
location ~ \.php$ { # 匹配以 .php 结尾的 URI,区分大小写 }
- 请求
/index.php
会匹配成功。 - 请求
/index.PHP
不会匹配(除非使用~*
)。
4. 普通前缀匹配
没有前缀的 location
指令进行普通前缀匹配。普通前缀匹配的优先级最低,只有在没有其他更高优先级的匹配时,才会使用普通前缀匹配。
示例:
location / { # 匹配所有 URI }
- 请求
/
、/any
或/any/path
都会匹配成功。
5. 匹配优先级
Nginx 的 location
匹配优先级如下:
- 精确匹配 (
=
) - 前缀匹配 (
^~
) - 正则表达式匹配 (
~
或~*
) - 普通前缀匹配
Nginx 会按照上述优先级顺序依次尝试匹配,一旦匹配成功,就会停止后续的匹配过程。