Do Apache ao Nginx: reescrita complexa com subdomínios de caractere curinga

1

Estou fazendo a transição do Apache para o Nginx e estou tentando descobrir como fazer com que minhas regras de reconfiguração de subdomínio funcionem.

Apache

A configuração do Apache basicamente move todo o tráfego para HTTPS e altera domínios .net e .org para o domínio .com principal. Alguns de nossos usuários ainda acham que cada URL deve começar com "www", de modo que a configuração o remova se também houver outro subdomínio. Os URLs sem qualquer subdomínio são redirecionados para o link , que não é necessariamente obrigatório para o site funcionar.

# HTTP
<VirtualHost *:80>
    RewriteEngine on

    # Redirect http://example.tld -> https://www.example.com
    RewriteCond %{SERVER_PORT} !^443$
    RewriteCond %{HTTP_HOST} ^example\.(com|net|org)
    RewriteRule ^(.*)$ https://www.example.com$1

    # Redirect http://www.subdomain.example.tld -> https://subdomain.example.com
    RewriteCond %{SERVER_PORT} !^443$
    RewriteCond %{HTTP_HOST} ^www.([^\.]+)\.example\.(com|net|org)
    RewriteRule ^(.*)$ https://%1.example.com$1

    # Redirect http://subdomain.example.tld -> https://subdomain.example.com
    RewriteCond %{SERVER_PORT} !^443$
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.(com|net|org)
    RewriteRule ^(.*)$ https://%1.example.com$1 [NC,R,L]

    # ...

</VirtualHost>

# HTTPS
<VirtualHost *:443>
    RewriteEngine on

    # Redirect https://example.tld -> https://www.example.com
    RewriteCond %{HTTP_HOST} ^example\.(com|net|org)
    RewriteRule ^(.*)$ https://www.example.com$1

    # Redirect https://www.subdomain.example.tld -> https://subdomain.example.com
    RewriteCond %{HTTP_HOST} ^www.([^\.]+)\.example\.(com|net|org)
    RewriteRule ^(.*)$ https://%1.example.com$1

    # Redirect https://subdomain.example.(net|org) -> https://subdomain.example.com
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.(net|org)
    RewriteRule ^(.*)$ https://%1.example.com$1 [NC,R,L]

    # Otherwise serve https://subdomain.example.com

    # ...

</VirtualHost>

Nginx

A configuração do Nginx que tenho até agora funciona na maioria dos casos, mas não sei como remover "www" quando o URL está no formato http (s): //www.subdomain.example.tld. De acordo com link "se é mal", então eu tentei para mantê-los fora dos casos de uso mais comuns.

# Redirect http://subdomain.example.com -> https://subdomain.example.com
# Redirect http://example.com -> https://example.com
server {
    listen       80;
    server_name  .example.com;
    return       301 https://$host$request_uri;
}

# Redirect https://subdomain.example.(net|org) -> https://subdomain.example.com
server {
    listen       80;
    server_name  .example.net .example.org;
    if ($host ~* "^([^.]+(\.[^.]+)*)\.example\.(net|org)$") {
            set $subdomain $1;
            rewrite ^(.*)$ https://$subdomain.example.com$1 permanent;
            break;
    }
    return 301 https://www.example.com;
}

# Otherwise serve https://subdomain.example.com
server {
    listen       443 ssl;
    server_name  .example.com;

    # ...
}

Então, minha pergunta é: como eu removo a parte "www" quando há outro subdomínio já presente no caminho certo do Nginx? Em um caso ideal, a configuração do Nginx deve funcionar da mesma forma que a minha configuração antiga do Apache. Há muitas perguntas e respostas que abordam casos simples em que os subdomínios podem ser listados manualmente no arquivo de configuração. Isso não é uma opção para mim.

    
por Steve 27.03.2014 / 16:24

1 resposta

1

Depois de perceber que server_name também pode ser uma regex , isso é o que tenho agora . Outra surpresa positiva foi que o mesmo bloco server pode lidar com casos HTTP e HTTPS. Acabei de comentar a linha ssl on; do meu arquivo ssl.inc config. Tanto quanto eu posso dizer esta configuração parece funcionar como a minha antiga configuração do Apache.

# Redirect http://example.tld -> https://www.example.com
server {
    listen       80;
    server_name  www.example.com www.example.net www.example.org;
    return       301 https://www.example.com$request_uri;
}

# Redirect http(s)://example.tld -> https://www.example.com
server {
    listen       80;
    listen       443 ssl;
    server_name  example.com example.net example.org;
    return       301 https://www.example.com$request_uri;

    include conf.d/ssl.inc;
}

# Serve https://subdomain.example.com
server {
    listen       443 ssl;
    server_name  ~^[^\.]+\.example\.com$;

    include conf.d/ssl.inc;
    include conf.d/common.inc;
}

# Redirect http(s)://www.whatever.subdomain.example.tld -> https://subdomain.example.com
server {
    listen       80;
    listen       443 ssl;
    server_name  ~\.(?<subdomain>[^\.]+)\.example\.(com|net|org)$  ~^(?<subdomain>[^\.]+)\.example\.(net|org)$;
    return       301 https://$subdomain.example.com$request_uri;

    include conf.d/ssl.inc;
}
    
por 28.03.2014 / 14:10