Nginx 匹配规则的一个小问题

本文探讨了在Docker环境下使用Nginx最新版本时遇到的静态文件访问问题。原本有效的配置无法正常工作,通过调整配置解决了这一问题,并分析了不同配置下Nginx如何处理静态文件。

老版本一直使用

location /upload/ {

    root     /www/upload;

}

http://localhost/upload/icon.jpg

是可以访问到静态文件的


但在 docker 中使用 nginx:latest 版本时,同样的配置就是找不到静态文件

看了官方文档的解释

server { 

    location / { 

        root /data/www; 

    } 

    location /images/ { 

        root /data; 

    }

}

如果请求 url 以 /images/ 开头,则响应 /data/images 目录中的文件,如果不以 /images/ 开头,则响应 /data/www 目录中的文件

所以最上面的配置应改为

location /upload/ {

    root /www;

}

但是原来的项目按之前的配置确实跑的起来,不知道原来搞错了还是现在新版本变化了

Nginx 的 `server` 块匹配机制主要依赖于 `listen` 指令和 `server_name` 指令的组合。当客户端发起请求时,Nginx 会根据请求的 IP 地址和端口与 `listen` 指令进行匹配,然后根据请求头中的 `Host` 字段与 `server_name` 指令进行匹配。如果 `listen` 指令无法确定最佳匹配Nginx 会继续解析 `server_name` 指令以找到最匹配的 `server` 块。 在匹配过程中,Nginx **不会继续匹配后续的 `server` 块**,而是遵循以下规则: 1. **精确匹配 `server_name`**:Nginx 会优先尝试匹配与请求头中 `Host` 值完全相同的 `server_name`。如果找到匹配项,Nginx 会立即使用该 `server` 块处理请求[^1]。 2. **通配符匹配**:如果未找到精确匹配项,Nginx 会尝试使用通配符匹配 `server_name`,例如 `*.example.com` 或 `example.*`。通配符只能出现在 `server_name` 的开头或结尾部分。 3. **正则表达式匹配**:如果仍未找到匹配项,Nginx 会尝试使用正则表达式匹配 `server_name`,例如 `~^www\.example\.com$`。正则表达式匹配的优先级低于通配符匹配和精确匹配[^1]。 4. **默认 `server` 块**:如果所有匹配规则都无法匹配请求,Nginx 会使用默认的 `server` 块处理请求。默认 `server` 块通常是配置文件中第一个定义的 `server` 块,除非显式指定了 `default_server` 参数[^1]。 因此,Nginx匹配 `server` 块时遵循“找到最佳匹配后立即停止”的原则,不会继续匹配后续的 `server` 块。这种机制确保了请求的高效处理,并避免了不必要的配置冲突。 ### 示例配置 以下是一个典型的 `server` 块配置示例,展示了 Nginx 如何根据 `server_name` 匹配请求: ```nginx server { listen 80; server_name example.com www.example.com; location / { root /var/www/example; } } server { listen 80; server_name *.example.org; location / { root /var/www/example_org; } } server { listen 80 default_server; server_name _; location / { root /var/www/default; } } ``` 在上述配置中: - 请求 `http://example.com` 和 `http://www.example.com` 会匹配一个 `server` 块。 - 请求 `http://sub.example.org` 会匹配第二个 `server` 块。 - 如果请求的 `Host` 头无法匹配前两个 `server` 块,则会匹配第三个默认 `server` 块。 ### 调试技巧 - 使用 `nginx -t` 命令检查配置文件的语法是否正确。 - 使用 `nginx -T` 命令查看完整的配置文件,包括所有包含的文件。 - 启用调试日志:`error_log logs/error.log debug;`,以便查看详细的匹配过程[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值