O Apache reescreve qualquer subdomínio, exceto um, para https não www

O Apache reescreve qualquer subdomínio, exceto um, para https não www

Estou tentando reduzir a quantidade de encadeamento de redirecionamento 301 em meu servidor, então gostaria de combinar um subdomínio para um redirecionamento não www (exceto onde o subdomínio está dev) com um redirecionamento HTTP para HTTPS (usando %{HTTP:X-Forwarded-Proto}) como a instância está atrás um balanceador de carga.

Aqui está o que tenho até agora no meu .htaccess:

# move http to https 
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]

# Remove leading www 
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]

Existem três problemas com minha implementação atual:

  1. Uma solicitação para http://www.example.netterá dois redirecionamentos.

  2. Como a maioria dos exemplos de redirecionamento www para não www neste site, ele não redirecionará ww.ou wwww.então minha análise tem muitos subdomínios digitados incorretamente que não foram redirecionados.

  3. Gostaria de excluir o dev.subdomínio do redirecionamento, assim http://dev.example.netcomo seu httpsirmão, conforme uso dev.para desenvolvimento e teste de lançamento.

Como devo combinar isso?

Responder1

1) Uma solicitação http://www.example.netterá dois redirecionamentos.

Isso pode ser resolvido simplesmente invertendo as duas regras. Em seguida, www.example.neté redirecionado para HTTPS no primeiro redirecionamento, portanto, o redirecionamento HTTP para HTTPS não precisa ser acionado.

(Isso, no entanto, pressupõe que você não tem intenção de implementarHSTS- nesse caso, você precisaria mantê-los como dois redirecionamentos desde o redirecionamento para HTTPS no mesmo nome de hostprimeiroé um requisito.)

2) Como a maioria dos exemplos de redirecionamento www para não www neste site, ele não redirecionará ww.ou wwww.então minha análise tem muitos subdomínios digitados incorretamente que não foram redirecionados.

Normalmente, solicitações para ww.ou wwww.subdomínios simplesmente não serão resolvidas, portanto isso normalmente não é um problema. Para que isso funcione você precisa ter configurado umcuringasubdomínio no DNS e configurou o servidor para aceitar tais solicitações.

Mas isso pode ser explicado modificando o regex (snippet) de ^www\.para ^w{2,4}\..

3) Gostaria de excluir o dev.subdomínio do redirecionamento, assim http://dev.example.netcomo seu httpsirmão, conforme uso dev.para desenvolvimento e teste de lançamento.

Isso se aplica apenas à regra HTTP para HTTPS, portanto, uma condição adicional pode ser aplicada aqui para excluir nomes de host que começam com dev..

Reunindo os pontos acima, tente o seguinte:

# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]

# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]

Mantive o uso do HTTP:Hostmesmo (para acessar o Hostcabeçalho da solicitação HTTP) caso isso seja um requisito do balanceador de carga? Caso contrário, é mais comum usar a HTTP_HOSTvariável server aqui.

O !prefixo noCondPadrão(ou seja, !^dev\.) nega o regex, então a condição é bem-sucedida quando Hostfaznãocomeçar com dev.. (Presumo que www.dev.não seja uma coisa?)

(.*)é o mesmo que ^(.*)$o regex é ganancioso por padrão.

Você precisará limpar o cache do navegador antes de testar. É aconselhável testar primeiro com redirecionamentos 302 (temporários) para evitar problemas de cache.

Responder2

# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV]
RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301]

# move http to https, except for dev.example.net
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV]
RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  1. Adicionado o sinalizador NC( nocase) à X-Forwarded-Protocondição, uma vez que seu valor parecia ser insignificante para maiúsculas e minúsculas, ou seja HTTP = Http = hTTp = http, . Você está livre para remover isso.
  2. Adicionado sinalizador NV( novary) à X-Forwarded-Protocondição para ocultá-la do Varycabeçalho de resposta. Novamente, você está livre para remover isso, especialmente se não for o caso (o proxy reverso o filtra automaticamente para você antes de enviá-lo ao cliente) ou necessário para o comportamento correto do cache (o cache não distingue httpconteúdo https).
  3. Adicionado sinalizador NV( novary) à Hostcondição do cabeçalho para ocultá-lo do Varycabeçalho de resposta. Você também pode remover isso se tiver um servidor de cache quebrado.
  4. Tornou a RewriteRuleordem das bandeiras consistente ( L,R=301e R=301,Lsão essencialmente as mesmas).
  5. Impedido www.example.net.but.not.actually.yours.comde ser reconhecido, mas ainda permite, por exemplo www.example.net:443.
  6. Use consistentemente %{REQUEST_URI}como substituição.
  7. Também reconheça wwe wwww.

informação relacionada