web-dev-qa-db-fra.com

Modification d'un en-tête d'emplacement avec nginx proxy_pass

J'ai un nginx proxy_pass configuration pour transmettre chaque demande sur /api jusqu'à un backend Tomcat REST. Ce service renvoie dans certains cas un en-tête Location qui varie en fonction du type de demande, par exemple Location: http://foo.bar/baz/api/search/1234567 - la partie baz est due à son hébergement sur Tomcat.

Ma configuration actuelle réécrit le foo.bar Nom d'hôte correctement, mais laisse la partie baz intacte. Je voudrais supprimer cela, mais les options proxy_pass semblent se limiter à effacer ou à définir une nouvelle valeur pour l'en-tête.

Existe-t-il un moyen de modifier dynamiquement les en-têtes avant de les transmettre au client, en utilisant un substitut d'expression régulière, par exemple? Voici ma configuration nginx:

location /api {
    proxy_set_header Host $Host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_max_temp_file_size 0;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;
    proxy_redirect off;

    proxy_pass http://foo.bar:8080/baz/api;
}
15
user2010963

Vous pourrez peut-être utiliser regexp pour le modifier mais une meilleure façon est d'utiliser une redirection proxy:

proxy_redirect http://foo.bar/baz/ /;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

En-têtes de n'importe quel emplacement pour foo.bar/baz/ ira à /

Si vous souhaitez simplement rediriger /baz/api, ça marchera aussi.

Si des redirections ajoutent également le port, vous devrez ajouter http://foo.bar:8080/baz/ également (redirection séparée).

J'espère que cela t'aides!

16
Chelsea Urquhart