arquivo htaccess para executar regras específicas para diferentes domínios

arquivo htaccess para executar regras específicas para diferentes domínios

Eu tenho um aplicativo com servidor em vários domínios (cada um personaliza a aparência do aplicativo.

Além disso, existe um domínio comum que possui vários subdomínios para exibir os mesmos dados acima.

Então - www.apples.comparece o mesmo queapples.efruit.co.uk

e - www.bananas.co.ukparece o mesmo quebananas.efruit.co.uk

etc.

Agora, tenho um SSL curinga para o domínio efruit.co.uk, então quero usar o arquivo htaccess para forçar todas as solicitações efruit.co.uk a usar https (se ainda não estiver fazendo isso).

Todos os outros domínios não terão SSL, portanto precisarão usar http para evitar avisos do navegador - novamente a partir do arquivo htaccess.

Eu também gostaria de usar o arquivo htaccess para que, se alguém digitar www.apples.efruit.co.uk, ele seja reescrito como apples.efruit.co.uk (em https como acima). No entanto, www. tudo bem se não for um domínio efruit.co.uk.

Finalmente, tenho a regra de reescrita padrão e bem documentada do codeigniter para tornar o URL mais bonito.

Aqui está o que tenho até agora.

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]

# block hidden directories
RewriteRule "(^|/)\." - [F]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

A única coisa que parece funcionar é forçar os domínios efruit.co.uk a serem servidos por https.

Responder1

Você parece estar atrás de um proxy SSL (?), daí o uso do X-Forwarded-Protocabeçalho da solicitação, em vez da HTTPSvariável do servidor.

RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Embora você afirme que este bit "funciona" ("forçando efruit.co.ukdomínios a serem servidos por https"), isso não redirecionará o domínio vazio principal e também manterá o subdomínio www, se presente na solicitação - você deve retirá-lo primeiro para evite um redirecionamento secundário. Assim, é necessária uma alteração na ordem destas directivas.

Você também não precisa de um grupo de captura (ou seja, um subpadrão entre parênteses), a menos que pretenda usá-lo como uma referência anterior - o que não parece ser.

Todos os outros domínios não terão SSL, portanto precisarão usar http para evitar avisos do navegador - novamente a partir do arquivo htaccess.

Você não pode emitir um redirecionamento HTTPS para HTTP .htaccesspara evitar o aviso do navegador nesses outros domínios - o que parece ser o que você está sugerindo. Porque o certificado SSL inválidoaviso do navegadorocorreantes .htaccessÉ executado. O handshake SSL ocorre logo no início da solicitação.

RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Portanto, o acima não será realmente executado a partir de um navegador, a menos que o usuário aceite o aviso do certificado SSL (o que não deveria).

RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]

Isso .htaccessresultaria em um redirecionamento inválido, para qualquer coisa, exceto a raiz do documento, porque a $1referência anterior não possui um prefixo de barra. Mesmo para a raiz do documento você deve incluir uma barra final nosubstituição(embora o navegador corrija isso implicitamente). Além disso, curioso por que você usou a REQUEST_URIvariável do servidor nas duas primeiras regras, mas usou uma referência anterior aqui?

Tente algo como o seguinte:

# Prevent any fruther processing when requesting "health_check.php"
# CHECK: Absence of start of string anchor?
RewriteRule health_check\.php$ - [L]

# Remove www sub-subdomain (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC]
RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L]

# HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# HTTPS to HTTP redirect for none "efruit.co.uk" domains
# Note that the user will still have to click through any browser security warnings
RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Outras notas:

  • Não há necessidade de barra invertida para escapar de um ponto literal quando usado dentro de uma classe de caractere.
  • Removi a $âncora do final da string na verificação do host para capturar o FQDN que inclui um ponto final.
  • Você provavelmente desejará alterar esses redirecionamentos permanentes (301) depois de confirmar que estão funcionando bem. ou seja. mudar Rpara R=301.

informação relacionada