Các khối nginx có thể khớp với chuỗi truy vấn URL không?location
Ví dụ: khối vị trí nào có thể phù hợp với GET
yêu cầu HTTP
GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
?
)?
Các khối nginx có thể khớp với chuỗi truy vấn URL không?location
Ví dụ: khối vị trí nào có thể phù hợp với GET
yêu cầu HTTP
GET /git/sample-repository/info/refs?service=git-receive-pack HTTP/1.1
?
)?
Câu trả lời:
Các khối vị trí nginx có thể khớp với chuỗi truy vấn URL không?
Câu trả lời ngắn gọn : Không.
Câu trả lời dài : Có một cách giải quyết nếu chúng ta chỉ có một số ít các khối vị trí như vậy.
Đây là một cách giải quyết mẫu cho 3 khối vị trí cần khớp với các chuỗi truy vấn cụ thể:
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
}
}
Bạn có thể sử dụng $ query_ chuỗi, $ args hoặc $ arg_fieldname. Tất cả sẽ làm công việc. Bạn có thể biết thêm về error_page trong các tài liệu chính thức .
Cảnh báo: Vui lòng đảm bảo không sử dụng mã HTTP tiêu chuẩn .
$args ~ "service=git-send-pack"
thay vì $args = "service=git-send-pack"
? Biểu mẫu này chứa nhiều tham số truy vấn.
if
và $arg_fieldname
, nhưng sử dụng rewrite
thay vì error_page
và location @name
. Lưu ý rằng trong ví dụ đó, những nỗ lực của tôi lúc sử dụng @name
cho thay thế tham số trong rewrite
đã không thành công.
$args ~
và $arg_somerandomfield =
.
map
tính năng nginx cho mục đích này, nhanh hơn.
query
tham số bằng một đường dẫn url như thế này feedback/{auth_key}
thay vì /feedback?auth_key=abc
. Bằng cách này, tôi không cần sử dụng if
, tôi có thể xác định mẫu vị trí bằng cách sử dụng regex
và đó là mẫu đó.
Tôi biết câu hỏi này đã hơn một năm tuổi, nhưng tôi đã dành vài ngày qua để phá hủy bộ não của mình vì một vấn đề tương tự. Tôi muốn các quy tắc xác thực và xử lý khác nhau cho các repos công khai và riêng tư, bao gồm cả đẩy và kéo. Đây là những gì tôi cuối cùng đã đưa ra, vì vậy tôi nghĩ rằng tôi muốn chia sẻ. Tôi biết if
là một chỉ thị khó khăn, nhưng điều này có vẻ hiệu quả với tôi:
# 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;
# ...
}