一. Nginx 的 location 配置类别和匹配优先级(从高到低)

类型示例说明
1. 精确匹配location = /完全相等才匹配(最高优先级)
2. 前缀匹配(带 ^~)location ^~ /images/普通字符串前缀匹配,不检查正则
3. 正则匹配location ~ \.php$
location ~* \.(jpg|png)$
按配置文件从上到下顺序匹配
4. 普通前缀匹配location /abc
location /
最长前缀优先

⚠️ 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.comGET /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

更多推荐