nginx反向代理配置及常见问题
·
一. Nginx 的 location 配置类别和匹配优先级(从高到低)
| 类型 | 示例 | 说明 |
|---|---|---|
| 1. 精确匹配 | location = / | 完全相等才匹配(最高优先级) |
2. 前缀匹配(带 ^~) | location ^~ /images/ | 普通字符串前缀匹配,不检查正则 |
| 3. 正则匹配 | location ~ \.php$location ~* \.(jpg|png)$ | 按配置文件从上到下顺序匹配 |
| 4. 普通前缀匹配 | location /abclocation / | 最长前缀优先 |
⚠️
location /是普通前缀匹配中最短的,所以是最后兜底的!
举个例子
server {
location = / {
# 1. 精确匹配根路径(优先级最高)
return 200 "Exact root\n";
}
location ^~ /static/ {
# 2. 前缀匹配 /static/,不走正则
alias /var/www/static/;
}
location ~ \.php$ {
# 3. 正则匹配 .php 文件
fastcgi_pass ...;
}
location /api/ {
# 4. 普通前缀匹配(比 / 长)
proxy_pass http://backend;
}
location / {
# 5. 兜底:匹配所有其他请求
try_files $uri $uri/ /index.php?$args;
}
}
✅ 当没有更高优先级的
location(精确、^~、正则、更长前缀)匹配时,location /作为最通用的前缀匹配会被选中。
常见问题:
问题1:如果我只请求的是一个域名呢?域名后面没有 / ,还会匹配 location / 吗
非常好的问题!这涉及到 Nginx 对 “裸域名”请求(如 http://example.com)的处理机制。
简短回答:
会!
http://example.com会被自动标准化为http://example.com/,然后匹配location /。
详细解释
浏览器或客户端实际发送的请求
当你在浏览器地址栏输入:
http://example.com
浏览器会自动补全路径为 /,实际发送的 HTTP 请求是:
GET / HTTP/1.1
Host: example.com
📌 所有符合 HTTP 标准的客户端(浏览器、curl、wget 等)都会这样做。
Nginx 如何处理
Nginx 收到请求后:
$uri的值就是/- 它会寻找能匹配
/的location块 location /是最通用的前缀匹配,所以一定会被选中
总结
| 用户输入 | 实际 HTTP 请求 | 匹配的 location | 最终结果 |
|---|---|---|---|
http://example.com | GET / | location / | 显示 WordPress 首页 |
http://example.com/ | GET / | location / | 显示 WordPress 首页 |
问题2:Nginx 将您重定向的次数过多
例如:下面这个就会反复重定向
rewrite /baidu/view/aa/bb.html /baiduweb/baidu/view/aa/bb.html redirect;
这种问题是由于A页面重定向到了B,B又重定向到了A导致。
正确修改如下:
rewrite ^/baidu/view/aa/bb.html /baiduweb/sz/view/aa/bb.html redirect;
二. proxy_pass代理转发
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。
第一种:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
第二种:( 相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html
第三种:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html
第四种(相对于第三种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html
参考链接:https://www.bilibili.com/video/BV1F5411J7vK?p=7&spm_id_from=pageDriver
更多推荐



所有评论(0)