nginx
location ^~ /task/ {
# 这样,当您访问 http://hostname:port/task/test 时,
# 请求会被转发到 proxy_pass /test,注意 /task/ 前缀在转发时被去掉了。
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
当您希望保留原始请求的 URI 时,您应该在 proxy_pass 指令中使用 ;
来结束地址部分,然后在后面添加 proxy_set_header Host $host; 来确保请求头的 Host 字段被正确设置。
请注意,我在 proxy_pass 指令的末尾添加了一个斜杠 /。这是非常重要的,因为它告诉 Nginx 在转发请求时去掉匹配的前缀(在这个例子中是 /task/)。如果省略了这个斜杠,Nginx 会将完整的原始 URI(包括 /task/ 前缀)转发到后端服务器
。
补充
Nginx 的匹配顺序是基于配置文件中的 location
块和它们的指令前缀。下面是 Nginx 匹配顺序的详细说明:
-
精确匹配:
如果请求的 URI 与location
块中的路径完全匹配(以=
开头),则 Nginx 会选择该location
块进行处理。 -
最长前缀匹配:
如果没有精确匹配,Nginx 会进行最长前缀匹配。它会选择路径最长的location
块,其中路径可以是普通字符串(不带^~
或正则表达式)或带有^~
前缀的路径。如果找到以^~
开头的location
块,Nginx 会立即停止搜索并使用该块,即使存在其他更长的普通字符串路径。 -
正则表达式匹配:
如果最长前缀匹配未找到匹配的location
块,Nginx 会检查以~
或~*
开头的location
块,这些块使用正则表达式来匹配请求的 URI。~
表示区分大小写的正则表达式匹配,而~*
表示不区分大小写的匹配。Nginx 会按照配置文件中的顺序逐个检查这些正则表达式,直到找到第一个匹配的location
块。 -
默认处理:
如果以上三个步骤都没有找到匹配的location
块,Nginx 会使用默认的location
块。默认的location
块通常是一个以/
开头的普通字符串路径,它会匹配所有未被其他location
块捕获的请求。
以下是一个简单的示例配置,展示了 Nginx 的匹配顺序:
server {
listen 80;
server_name example.com;
location = /exact-match {
# 处理精确匹配的请求
}
location ^~ /prefix-match {
# 处理以 "prefix-match" 开头的最长前缀请求
}
location / {
# 处理所有其他请求
}
location ~* \.php$ {
# 处理所有以 ".php" 结尾的请求,不区分大小写
}
location ~ \.jpg$ {
# 处理所有以 ".jpg" 结尾的请求,区分大小写
}
}
在这个示例中,如果请求是 /exact-match
,Nginx 会选择第一个 location
块。如果请求是 /prefix-match/something
,Nginx 会选择第二个 location
块,因为 ^~
前缀指定了最长前缀匹配。对于所有其他请求,Nginx 会按照配置文件中的顺序继续检查正则表达式匹配,或者最终使用默认的第三个 location
块。