Risposte:
Dalla documentazione proxy_pass :
Un caso speciale è l'utilizzo di variabili nell'istruzione proxy_pass: l'URL richiesto non viene utilizzato e l'utente è completamente responsabile della creazione da sé dell'URL di destinazione.
Dato che stai usando $ 1 nel target, nginx fa affidamento su di te per dirgli esattamente cosa passare. Puoi risolvere questo problema in due modi. Innanzitutto, rimuovere l'inizio dell'uri con un proxy_pass è banale:
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/;
}
Oppure, se desideri utilizzare la posizione dell'espressione regolare, includi semplicemente gli argomenti:
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
location /service/ { rewrite ^\/service\/(.*) /$1 break; proxy_pass http://apache; }
Uso una versione leggermente modificata del secondo approccio di kolbyjack con ~
invece di ~*
.
location ~ ^/service/ {
proxy_pass http://apache/$uri$is_args$args;
}
Ho modificato il codice @kolbyjack per farlo funzionare
http://website1/service
http://website1/service/
con parametri
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
proxy_pass
direttiva sopra fa il reindirizzamento sul lato server.
devi usare la riscrittura per passare i parametri usando proxy_pass ecco un esempio che ho fatto per la distribuzione dell'app angularjs su s3
Hosting di siti Web statici S3 Instrada tutti i percorsi a Index.html
adottato per le tue esigenze sarebbe qualcosa di simile
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://apache;
}
se vuoi finire in http://127.0.0.1:8080/query/params/
se vuoi finire in http://127.0.0.1:8080/service/query/params/ avrai bisogno di qualcosa di simile
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://apache;
}
/path/params
) ma non query 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
Per reindirizzare senza stringa di query aggiungere le righe seguenti nel blocco del server sotto la linea della porta di ascolto:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
Con stringa di query:
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}
if
quando possibile. In questo caso, la soluzione potrebbe essere corretta usando location
come mostrato in un'altra risposta.
lavorato con l'aggiunta di $ request_uri proxy_pass http: // apache / $ request_uri;