AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 811912
Accepted
Derek Mahar
Derek Mahar
Asked: 2016-10-29 08:08:53 +0800 CST2016-10-29 08:08:53 +0800 CST 2016-10-29 08:08:53 +0800 CST

nginx 位置块可以匹配 URL 查询字符串吗?

  • 772

nginx location块可以匹配 URL 查询字符串吗?

例如,什么位置块可能匹配 HTTPGET请求

GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
http nginx
  • 3 3 个回答
  • 102291 Views

3 个回答

  • Voted
  1. Best Answer
    Pothi Kalimuthu
    2016-10-29T13:41:47+08:002016-10-29T13:41:47+08:00

    nginx 位置块可以匹配 URL 查询字符串吗?

    简短的回答:没有。

    长答案:如果我们只有少数这样的位置块,则有一种解决方法。

    以下是需要匹配特定查询字符串的 3 个位置块的示例解决方法:

    server {
      #... common definitions such as server, root
    
      location / {
        error_page 418 = @queryone;
        error_page 419 = @querytwo;
        error_page 420 = @querythree;
    
        if ( $query_string = "service=git-receive-pack" ) { return 418; }
        if ( $args ~ "service=git-upload-pack" ) { return 419; }
        if ( $arg_somerandomfield = "somerandomvaluetomatch" ) { return 420; }
    
        # do the remaining stuff
        # ex: try_files $uri =404;
    
      }
    
      location @queryone {
        # do stuff when queryone matches
      }
    
      location @querytwo {
        # do stuff when querytwo matches
      }
    
      location @querythree {
        # do stuff when querythree matches
      }
    }
    

    您可以使用 $query_string、$args 或 $arg_fieldname。所有人都会做这项工作。您可能会在官方文档中了解更多关于 error_page 的信息。

    警告:请务必不要使用标准 HTTP 代码。

    • 53
  2. Jared Brandt
    2018-02-09T12:26:30+08:002018-02-09T12:26:30+08:00

    我知道这个问题已经有一年多了,但在过去的几天里,我一直在为一个类似的问题摧毁我的大脑。我想要公共和私人回购的不同身份验证和处理规则,包括推送和拉取。这是我最终想出的,所以我想我会分享。我知道if这是一个棘手的指令,但这似乎对我有用:

    # pattern for all repos, public or private, followed by username and reponame
    location ~ ^(?:\/(private))?\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?$ {
    
        # if this is a pull request
        if ( $arg_service = "git-upload-pack" ) {
    
            # rewrite url with a prefix
            rewrite ^ /upload$uri;
    
        }
    
        # if this is a push request
        if ( $arg_service = "git-receive-pack" ) {
    
            # rewrite url with a prefix
            rewrite ^ /receive$uri;
    
        }
    
    }
    
    # for pulling public repos
    location ~ ^\/upload(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
    
        # auth_basic "git";
        # ^ if you want
    
        # ...
        # fastcgi_pass unix:/var/run/fcgiwrap.socket;
        # ...
    
    }
    
    # for pushing public repos
    location ~ ^\/receive(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
    
        # auth_basic "git";
        # ^ if you want
    
        # ...
        # fastcgi_pass unix:/var/run/fcgiwrap.socket;
        # ...
    
    }
    
    # for pulling private repos
    location ~ ^\/upload\/private(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
    
        # auth_basic "git";
        # ^ if you want
    
        # ...
        # fastcgi_pass unix:/var/run/fcgiwrap.socket;
        # ...
    
    }
    
    # for pushing private repos
    location ~ ^\/receive\/private(\/([A-Za-z0-9]+)\/([A-Za-z0-9]+)\.git(\/.*)?)$ {
    
        # auth_basic "git";
        # ^ if you want
    
        # ...
        # fastcgi_pass unix:/var/run/fcgiwrap.socket;
        # ...
    
    }
    
    • 6
  3. Lucas Ventura
    2020-07-21T09:35:01+08:002020-07-21T09:35:01+08:00

    如果您使用 nginx 作为代理,还有另一种方法可以做到这一点。

    在服务器块中设置一个变量:

    set $nocache="0";
    

    在 location 块中,添加 if:

    if ( $arg_<query string to match> = "<query string value>") { set $nocache "1"; }
    

    并添加两个新的代理指令:

    proxy_cache_bypass $nocache ;
    proxy_no_cache $nocache ;
    

    它将始终转发到没有缓存的上游服务器

    • -1

相关问题

  • 设置 http 代理以使用 Web 界面?

  • 无法连接到 Ubuntu Desktop 中的端口 80 或 VMWare Workstation 6.52 中的 Server 9.04

  • IIS 7.5 (Windows 7) - HTTP 错误 401.3 - 未经授权

  • 为什么有些网站的网址中没有“www”就无法显示?[关闭]

  • Tomcat 6 HTTP 日志滚动和清除

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve