From 2f71008ea4a69189dbac0d7e93f8d3d782e5f325 Mon Sep 17 00:00:00 2001 From: propheth Date: Thu, 25 Feb 2021 11:59:58 -0500 Subject: [PATCH 1/2] Add support for virtual host redirection --- nginx.tmpl | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/nginx.tmpl b/nginx.tmpl index 07e2b50..012d747 100644 --- a/nginx.tmpl +++ b/nginx.tmpl @@ -225,6 +225,8 @@ upstream {{ $upstream_name }} { {{/* Get the VIRTUAL_ROOT By containers w/ use fastcgi root */}} {{ $vhost_root := or (first (groupByKeys $containers "Env.VIRTUAL_ROOT")) "/var/www/public" }} +{{/* Get the first redirect defined by containers w/ the same vhost */}} +{{ $redirectHost := or (first (groupByKeys $containers "Env.REDIRECT")) ""}} {{/* Get the first cert name defined by containers w/ the same vhost */}} {{ $certName := (first (groupByKeys $containers "Env.CERT_NAME")) }} @@ -260,10 +262,20 @@ server { try_files $uri =404; break; } - + + {{ if (and $redirectHost (ne $redirectHost $host)) }} + # Redirect host {{ $host }} => {{ $redirectHost }} + {{ end }} + + {{ if (and $redirectHost (ne $redirectHost $host)) }} + location / { + return 301 https://{{ $redirectHost }}$request_uri; + } + {{ else }} location / { return 301 https://$host$request_uri; } + {{ end }} } {{ end }} @@ -308,7 +320,12 @@ server { {{ else if (exists "/etc/nginx/vhost.d/default") }} include /etc/nginx/vhost.d/default; {{ end }} + + {{ if (and $redirectHost (ne $redirectHost $host)) }} + # Redirect host {{ $host }} => {{ $redirectHost }} + {{ end }} + {{ if (or (not $redirectHost) (eq $redirectHost $host)) }} location / { {{ if eq $proto "uwsgi" }} include uwsgi_params; @@ -333,6 +350,13 @@ server { include /etc/nginx/vhost.d/default_location; {{ end }} } + {{ end }} + + {{ if (and $redirectHost (ne $redirectHost $host)) }} + location / { + return 301 https://{{$redirectHost}}$request_uri; + } + {{ end }} } {{ end }} @@ -357,7 +381,12 @@ server { {{ else if (exists "/etc/nginx/vhost.d/default") }} include /etc/nginx/vhost.d/default; {{ end }} + + {{ if (and $redirectHost (ne $redirectHost $host)) }} + # Redirect host {{ $host }} => {{ $redirectHost }} + {{ end }} + {{ if (or (not $redirectHost) (eq $redirectHost $host)) }} location / { {{ if eq $proto "uwsgi" }} include uwsgi_params; @@ -381,6 +410,13 @@ server { include /etc/nginx/vhost.d/default_location; {{ end }} } + {{ end }} + + {{ if (and $redirectHost (ne $redirectHost $host)) }} + location / { + return 301 http://{{ $redirectHost }}$request_uri; + } + {{ end }} } {{ if (and (not $is_https) (exists "/etc/nginx/certs/default.crt") (exists "/etc/nginx/certs/default.key")) }} From b9c182ade17ab1a5606cb2966e2d3ffe3b172811 Mon Sep 17 00:00:00 2001 From: propheth Date: Thu, 25 Feb 2021 21:00:06 +0100 Subject: [PATCH 2/2] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c62a10..5d8d118 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,8 @@ services: whoami: image: jwilder/whoami environment: - - VIRTUAL_HOST=whoami.local + - VIRTUAL_HOST=whoami.local,www.whoami.local + - REDIRECT=www.whoami.local ``` ```shell @@ -82,6 +83,10 @@ If you need to support multiple virtual hosts for a container, you can separate You can also use wildcards at the beginning and the end of host name, like `*.bar.com` or `foo.bar.*`. Or even a regular expression, which can be very useful in conjunction with a wildcard DNS service like [xip.io](http://xip.io), using `~^foo\.bar\..*\.xip\.io` will match `foo.bar.127.0.0.1.xip.io`, `foo.bar.10.0.2.2.xip.io` and all other given IPs. More information about this topic can be found in the nginx documentation about [`server_names`](http://nginx.org/en/docs/http/server_names.html). +### Redirect Hosts + +Using the `REDIRECT` environment variable, you can 301 permanent redirect all your virtual hosts to a specific host. Commonly used in production for SEO purposes. For example, you can redirect both `www.bar.com,bar.com` to `www.bar.com` using `REDIRECT=www.bar.com` or `www.bar.com,bar.com` to `bar.com` using `REDIRECT=bar.com`. + ### Multiple Networks With the addition of [overlay networking](https://docs.docker.com/engine/userguide/networking/get-started-overlay/) in Docker 1.9, your `nginx-proxy` container may need to connect to backend containers on multiple networks. By default, if you don't pass the `--net` flag when your `nginx-proxy` container is created, it will only be attached to the default `bridge` network. This means that it will not be able to connect to containers on networks other than `bridge`.