Respostas:
Da documentação do proxy_pass :
Um caso especial é o uso de variáveis na instrução proxy_pass: O URL solicitado não é usado e você é totalmente responsável por construir o URL de destino sozinho.
Como você está usando $ 1 no destino, o nginx depende de você para dizer exatamente o que deve ser passado. Você pode consertar isso de duas maneiras. Primeiro, remover o início do uri com um proxy_pass é trivial:
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/;
}
Ou se você quiser usar o local do regex, apenas inclua os argumentos:
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
Eu uso uma versão ligeiramente modificada da segunda abordagem de Kolbyjack com em ~
vez de~*
.
location ~ ^/service/ {
proxy_pass http://apache/$uri$is_args$args;
}
Eu modifiquei o código @kolbyjack para fazê-lo funcionar para
http://website1/service
http://website1/service/
com parâmetros
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
proxy_pass
diretiva acima faz o redirecionamento no lado do servidor.
você tem que usar reescrever para passar parâmetros usando proxy_pass aqui está o exemplo que fiz para a implantação do aplicativo angularjs para s3
S3 Static Website Hosting Rota todos os caminhos para index.html
adotado para suas necessidades seria algo como
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://apache;
}
se você quiser terminar em http://127.0.0.1:8080/query/params/
se você quiser terminar em http://127.0.0.1:8080/service/query/params/, você precisará de algo como
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://apache;
}
/path/params
), mas não consulta params ( ?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
Para redirecionar sem string de consulta, adicione as linhas abaixo no bloco do servidor na linha da porta de escuta:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
Com Query String:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}
if
quando possível. Nesse caso, a solução pode ser acertada usando location
como mostrado em outras respostas.
trabalhou com a adição de $ request_uri proxy_pass http: // apache / $ request_uri;