Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nginx: when to use proxy_set_header Host $host vs $proxy_host

I've been reading up on reverse proxying and am wondering when proxy_set_header Host $host is appropriate over proxy_set_header Host $proxy_host. I did some research and in this article it says that in most cases we set Host to $host. Then why does nginx default to $proxy_host? To help me understand more concretely, will the reverse proxy configuration here (bottom of article) still work if we use $proxy_host instead?

Thanks

like image 598
Alex H Avatar asked Sep 27 '16 03:09

Alex H


People also ask

What does Proxy_set_header host $host do?

The reverse is readily possible: proxy_set_header Host $host; will replace any Host variable coming back from the upstream with the hostname from the original request.

What is Proxy_set_header in Nginx?

To adjust or set headers for proxied connections, use the proxy_set_header directive, followed by the header value. You can find a list of all available Request Headers and their allowed values here . If you want to prevent a header from being passed to the proxied server, set it to an empty string "" .

Why use Nginx reverse proxy?

The benefits of using Nginx as a reverse proxy include: Clients access all backend resources through a single web address. The reverse proxy can serve static content, which reduces the load on application servers such as Express, Tomcat or WebSphere.

What is Proxy_host in Nginx?

$proxy_host is a tag about upstreams servers, so nginx do this one by default. If you want to add other tag(header) about the host, use $host . Follow this answer to receive notifications.


1 Answers

In general there is no need to explicitly do proxy_set_header Host proxy_host because it's the default. If you need to call a server by something other than what is in the proxy_pass directive, then you will need to override via proxy_set_header something.

If you want to proxy the same host as was in your server_name directive, then you would have occasion to use proxy_set_header $host. This would commonly be the case if perhaps the actual application is hosted on another port or on some internal server.

server {     listen 80;     server_name site.example.com;      location / {        proxy_set_header Host $host;        proxy_pass http://localhost:8080;     } } 

If the name you are calling the upstream is not its actual DNS name, then you might have something like:

# 192.168.2.1 responds to site.example.com, but # site.example.com doesn't actually resolve to 192.168.2.1 proxy_pass http://192.168.2.1; proxy_set_header Host site.example.com; 

Another case might be for "name-based" virtual hosting where there is a useful DNS name for the upstream, but you would like to call it by another name.

proxy_pass http://origin.example.com; proxy_set_header Host site.example.com 
like image 93
Joshua DeWald Avatar answered Sep 21 '22 06:09

Joshua DeWald