Odpowiedzi:
Z dokumentacji proxy_pass :
Specjalnym przypadkiem jest użycie zmiennych w instrukcji proxy_pass: żądany adres URL nie jest używany i jesteś w pełni odpowiedzialny za samodzielne skonstruowanie docelowego adresu URL.
Ponieważ używasz 1 $ w celu, nginx polega na tobie, aby powiedzieć mu dokładnie, co ma przekazać. Możesz to naprawić na dwa sposoby. Po pierwsze, usunięcie początku uri za pomocą proxy_pass jest trywialne:
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/;
}
Lub jeśli chcesz użyć lokalizacji wyrażenia regularnego, po prostu dołącz argumenty:
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
Używam nieco zmodyfikowanej wersji drugiego podejścia Kolbyjacka z ~
zamiast ~*
.
location ~ ^/service/ {
proxy_pass http://apache/$uri$is_args$args;
}
Zmodyfikowałem kod @kolbyjack, aby działał
http://website1/service
http://website1/service/
z parametrami
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
proxy_pass
dyrektywa wykonuje przekierowanie po stronie serwera.
musisz użyć rewrite, aby przekazać parametry za pomocą proxy_pass, tutaj jest przykład, który zrobiłem dla wdrożenia aplikacji angularjs do s3
S3 Statyczny hosting witryny sieci Web kieruje wszystkie ścieżki do pliku Index.html
dostosowane do twoich potrzeb byłoby coś takiego
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://apache;
}
jeśli chcesz skończyć w http://127.0.0.1:8080/query/params/
jeśli chcesz skończyć w http://127.0.0.1:8080/service/query/params/ , potrzebujesz czegoś takiego
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://apache;
}
/path/params
), ale nie params zapytania ( ?query=params
)?
github gist 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
Aby przekierować bez ciągu zapytania, dodaj poniższe wiersze w bloku serwera pod linią portu nasłuchiwania:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
Z ciągiem zapytania:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}
if
gdy jest to możliwe. W takim przypadku rozwiązanie może być prawidłowe, location
jak pokazano w innych odpowiedziach.
pracował z dodaniem $ request_uri proxy_pass http: // apache / $ request_uri;