upstream Apache {
server 127.0.0.1:8080;
}
server{
location ~* ^/service/(.*)$ {
proxy_pass http://Apache/$1;
proxy_redirect off;
}
}
L'extrait ci-dessus redirigera les demandes dans lesquelles l'URL inclut la chaîne "service" vers un autre serveur, mais sans paramètres de requête.
Depuis le proxy_pass documentation:
Un cas particulier utilise des variables dans l'instruction proxy_pass: l'URL demandée n'est pas utilisée et vous êtes entièrement responsable de la construction de l'URL cible vous-même.
Puisque vous utilisez $ 1 dans la cible, nginx compte sur vous pour lui indiquer exactement ce qu'il doit transmettre. Vous pouvez résoudre ce problème de deux manières. Premièrement, effacer le début de l'URI avec un proxy_pass est 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 si vous voulez utiliser l'emplacement de regex, incluez simplement les arguments:
location ~* ^/service/(.*) {
proxy_pass http://Apache/$1$is_args$args;
}
J'utilise une version légèrement modifiée de la seconde approche de kolbyjack avec ~
au lieu de ~*
.
location ~ ^/service/ {
proxy_pass http://Apache/$uri$is_args$args;
}
J'ai modifié le code @kolbyjack pour le faire fonctionner
http://website1/service
http://website1/service/
avec des paramètres
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
vous devez utiliser rewrite pour passer les paramètres à l'aide de proxy_pass Voici un exemple que j'ai fait pour le déploiement de l'application angularjs sur s3
S3 Static Hosting Route Route Tous les chemins d'accès à Index.html
adopté à vos besoins serait quelque chose comme
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://Apache;
}
si vous voulez vous retrouver dans http://127.0.0.1:8080/query/params/
si vous voulez vous retrouver dans http://127.0.0.1:8080/service/query/params/ vous aurez besoin de quelque chose comme
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://Apache;
}
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
Pour rediriger sans chaîne de requête, ajoutez les lignes ci-dessous dans le bloc serveur sous la ligne d'écoute:
if ($uri ~ .*.containingString$) {
return 301 https://$Host/$uri/;
}
Avec la chaîne de requête:
if ($uri ~ .*.containingString$) {
return 301 https://$Host/$uri/?$query_string;
}