Usar $server_name
sempre usará o primeiro no bloco.
Você precisa usar $http_host
, que receberá o host de solicitações.
Como alternativa, basta criar três blocos para cada domínio.
Eu tenho esses dois blocos de servidor no meu nginx/sites-enabled/application.conf
:
upstream myapplication {
server 127.0.0.1:8081;
}
server {
listen 80;
server_name app1.example.net
app2.example.net
app3.example.net;
return 301 https://$server_name$request_uri;
}
server {
listen 80;
server_name app1.example.net
app2.example.net
app3.example.net;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_certificate /etc/ssl/certs/example_net.crt;
ssl_certificate_key /etc/ssl/certs/example_net.key;
ssl_verify_client off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
proxy_ssl_session_reuse off;
location /apply {
rewrite ^/apply(.*) $scheme://$server_name/?$query_string? permanent;
}
location / {
proxy_pass http://myapplication;
}
}
e este é o meu nginx/nginx.conf
:
usuário www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
disable_symlinks off;
# server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Proxy redirect
##
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
O problema que estou tendo é que, se eu visitar link app2.example.net, serei redirecionado para link app1.example.net quando ele me redirecionar para link app2.example.net, no entanto, se eu for direto para link app2.example.net, então isso funciona bem.
O que estou perdendo nessa configuração?
O Nginx selecionará a primeira entrada da variável server_name
. Tente usar $http_host
e veja se isso ajuda.
$http_host
receberá diretamente o host de solicitações da solicitação de HTTP. Como você está usando hosts virtuais, você só receberá solicitações para esse bloco de servidores que contêm um desses nomes, portanto, as solicitações HTTP sempre conterão um desses três hosts.