Bisakah nginx location
blok cocok dengan string kueri URL?
Misalnya, blok lokasi apa yang mungkin cocok dengan GET
permintaan HTTP
GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
?
)?
Bisakah nginx location
blok cocok dengan string kueri URL?
Misalnya, blok lokasi apa yang mungkin cocok dengan GET
permintaan HTTP
GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
?
)?
Jawaban:
Bisakah nginx blok lokasi cocok dengan string kueri URL?
Jawaban singkat : Tidak.
Jawaban panjang : Ada solusi jika kita hanya memiliki sedikit blok lokasi seperti itu.
Berikut ini contoh solusi untuk 3 blok lokasi yang harus cocok dengan string kueri tertentu:
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
}
}
Anda dapat menggunakan $ query_string, $ args atau $ arg_fieldname. Semua akan melakukan pekerjaan itu. Anda mungkin tahu lebih banyak tentang error_page di dokumen resmi .
Peringatan: Pastikan untuk tidak menggunakan kode HTTP standar .
$args ~ "service=git-send-pack"
bukan $args = "service=git-send-pack"
? Formulir ini mengakomodasi beberapa parameter kueri.
if
dan $arg_fieldname
, tetapi menggunakan rewrite
alih-alih error_page
dan location @name
. Perhatikan bahwa dalam contoh itu, upaya saya dalam menggunakan @name
untuk parameter pengganti di rewrite
tidak berhasil.
$args ~
dan $arg_somerandomfield =
.
map
fitur nginx untuk tujuan ini, yang lebih cepat.
query
parameter dengan jalur url yang seperti ini feedback/{auth_key}
alih-alih /feedback?auth_key=abc
. Dengan cara ini saya tidak perlu menggunakan if
, saya dapat menentukan pola lokasi menggunakan regex
dan hanya itu.
Saya tahu pertanyaan ini sudah lebih dari setahun, tetapi saya telah menghabiskan beberapa hari terakhir menghancurkan otak saya karena masalah yang sama. Saya ingin berbagai otentikasi dan aturan penanganan untuk repo publik dan pribadi, termasuk mendorong dan menarik. Inilah yang akhirnya saya buat, jadi saya pikir saya akan berbagi. Saya tahu if
ini adalah arahan yang rumit, tetapi ini tampaknya berhasil bagi saya:
# 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;
# ...
}