KingJio 2025-01-15 16:25 采纳率: 0%
浏览 11

关于nginx的location路径配置优先级问题

我现在同一个server里有两个块


location ^~ /h5/ {
        # root /www/wwwrooth5/;
        # index index.html;
        try_files $uri /index.html;
    }

location / { 
        proxy_pass http://127.0.0.1/abc;
        proxy_set_header Host $Host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_set_header X-Host $host:$server_port;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 30s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 30s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

我该怎么办才能让“http://wo50.com/h5/index”优先匹配第一个块。
现在老是走到第二个块上。

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-01-15 16:25
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    要确保 http://wo50.com/h5/index 能够优先匹配到第一个 location 块,你需要理解 Nginx 的 location 匹配规则。Nginx 会按照以下顺序进行匹配:

    1. 最长前缀匹配^~ 指令会立即停止搜索其他 location 块。
    2. 正则表达式匹配:如果没有找到匹配的 ^~ 指令,则会继续检查正则表达式 ~~*
    3. 普通字符串匹配:如果没有任何 ^~ 或正则表达式匹配,则会使用最长前缀匹配。

    基于你的配置,location ^~ /h5/ 应该优先匹配 /h5/ 开头的请求。但如果你发现请求仍然被第二个 location 块处理,可能是因为配置中有其他因素干扰。以下是一些解决方案和建议:

    解决方案

    1. 确保 ^~ 优先级

      • 确保 ^~ /h5/ 在配置文件中位于 / 之前。
      • 避免使用通配符或正则表达式来匹配 /h5/,因为它们可能会被 / 优先匹配。
    2. 明确指定路径

      • 如果 /h5/ 是静态内容目录,可以考虑取消注释 rootindex 指令。
    3. 调试日志

      • 启用 Nginx 的调试日志以查看匹配过程。

    修改后的配置

    server {
        listen 80;
        server_name wo50.com;
    
        # 最长前缀匹配,优先级最高
        location ^~ /h5/ {
            root /www/wwwroot/h5/;
            index index.html;
            try_files $uri /index.html;
        }
    
        # 普通匹配
        location / { 
            proxy_pass http://127.0.0.1/abc;
            proxy_set_header Host $Host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header REMOTE-HOST $remote_addr;
            add_header X-Cache $upstream_cache_status;
            proxy_set_header X-Host $host:$server_port;
            proxy_set_header X-Scheme $scheme;
            proxy_connect_timeout 30s;
            proxy_read_timeout 86400s;
            proxy_send_timeout 30s;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
    

    启用调试日志

    在 Nginx 配置文件中添加调试日志配置:

    error_log /var/log/nginx/error.log debug;
    

    然后重新加载 Nginx 配置:

    sudo nginx -t
    sudo systemctl reload nginx
    

    通过以上步骤,你应该能够确保 http://wo50.com/h5/index 请求优先匹配到第一个 location 块。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日