Jawaban:
Dari dokumentasi proxy_pass :
Kasus khusus menggunakan variabel dalam pernyataan proxy_pass: URL yang diminta tidak digunakan dan Anda bertanggung jawab penuh untuk membuat sendiri URL target.
Karena Anda menggunakan $ 1 di target, nginx mengandalkan Anda untuk memberitahukan dengan tepat apa yang harus dilewati. Anda dapat memperbaikinya dengan dua cara. Pertama, menghapus awal uri dengan proxy_pass itu sepele:
location /service/ {
# Note the trailing slash on the proxy_pass.
# It tells nginx to replace /service/ with / when passing the request.
proxy_pass http://apache/;
}
Atau jika Anda ingin menggunakan lokasi regex, cukup sertakan argumennya:
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
Saya menggunakan versi pendekatan kedua kolbyjack yang sedikit dimodifikasi, ~
bukan ~*
.
location ~ ^/service/ {
proxy_pass http://apache/$uri$is_args$args;
}
Saya memodifikasi kode @kolbyjack agar berfungsi
http://website1/service
http://website1/service/
dengan parameter
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
proxy_pass
direktif di atas melakukan pengalihan pada sisi server.
Anda harus menggunakan rewrite untuk meneruskan params menggunakan proxy_pass di sini adalah contoh yang saya lakukan untuk penyebaran aplikasi angularjs ke s3
Hosting Situs Statis S3 Merutekan Semua Jalur ke Index.html
diadopsi untuk kebutuhan Anda akan menjadi sesuatu seperti
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://apache;
}
jika Anda ingin berakhir di http://127.0.0.1:8080/query/params/
jika Anda ingin menggunakan http://127.0.0.1:8080/service/query/params/ Anda memerlukan sesuatu seperti
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://apache;
}
/path/params
) dengan baik tetapi tidak menangani parameter kueri ( ?query=params
)?
github inti https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7
#set $token "?"; # deprecated
set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`
if ($is_args) { # if the request has args update token to "&"
set $token "&";
}
location /test {
set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token
# if no args $is_args is empty str,else it's "?"
# http is scheme
# service is upstream server
#proxy_pass http://service/$uri$is_args$args; # deprecated remove `/`
proxy_pass http://service$uri$is_args$args; # proxy pass
}
#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2
#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2
Untuk mengalihkan Tanpa Query String tambahkan baris di bawah ini di blok Server di bawah baris port mendengarkan:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
Dengan Query String:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}
if
jika memungkinkan. Dalam hal ini, solusinya bisa benar menggunakan location
seperti yang ditunjukkan pada jawaban lain.
bekerja dengan menambahkan $ request_uri proxy_pass http: // apache / $ request_uri;