
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.com
parece o mesmo queapples.efruit.co.uk
e - www.bananas.co.uk
parece 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-Proto
cabeçalho da solicitação, em vez da HTTPS
variá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.uk
domí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 .htaccess
para 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 .htaccess
resultaria em um redirecionamento inválido, para qualquer coisa, exceto a raiz do documento, porque a $1
referê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_URI
variá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
R
paraR=301
.