it-swarm.com.de

Können Nginx-Standortblöcke mit einer URL-Abfragezeichenfolge übereinstimmen?

Kann nginxlocation blockiert mit einer URL-Abfragezeichenfolge übereinstimmen?

Zum Beispiel, welcher Standortblock mit der HTTP GET -Anforderung übereinstimmt

GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
25
Derek Mahar

Können Nginx-Standortblöcke mit einer URL-Abfragezeichenfolge übereinstimmen?

Kurze Antwort : Nein.

Lange Antwort : Es gibt eine Problemumgehung, wenn wir nur eine Handvoll solcher Standortblöcke haben.

Hier ist eine Beispielumgehung für 3 Standortblöcke, die mit bestimmten Abfragezeichenfolgen übereinstimmen müssen:

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
  }
}

Sie können $ query_string, $ args oder $ arg_fieldname verwenden. Alle werden den Job machen. Möglicherweise wissen Sie mehr über error_page in den offiziellen Dokumenten .

Warnung: Bitte stellen Sie sicher, dass nicht die Standard-HTTP-Codes verwendet.

39
Pothi Kalimuthu

Ich weiß, dass diese Frage über ein Jahr alt ist, aber ich habe die letzten Tage damit verbracht, mein Gehirn wegen eines ähnlichen Problems zu zerstören. Ich wollte unterschiedliche Authentifizierungs- und Handhabungsregeln für öffentliche und private Repos, einschließlich Drücken und Ziehen. Das habe ich mir endlich ausgedacht, also dachte ich mir, ich würde es teilen. Ich weiß, dass if eine knifflige Anweisung ist, aber das scheint für mich ganz gut zu funktionieren:

# 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;
    # ...

}
4
Jared Brandt