Você parece estar por trás de um proxy SSL (?), portanto, o uso do cabeçalho de solicitação X-Forwarded-Proto
, em vez da variável de servidor HTTPS
.
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]
Enquanto você declara que esse bit "funciona" ("forçando efruit.co.uk
domínios a serem exibidos por https"), isso não redirecionará o domínio principal principal e também manterá o subdomínio www, se presente na solicitação - você deve tirar isso primeiro para evitar um redirecionamento secundário. Então, uma mudança na ordem dessas diretivas é necessária.
Você também não precisa de um grupo de captura (ou seja, um subpadrão com parênteses), a menos que você pretenda usar isso como uma referência anterior - o que você não parece ser.
All other domains will not have an ssl so they will need to use http to avoid browser warnings - again from the htaccess file.
Você não pode emitir um redirecionamento HTTPS para HTTP de .htaccess
para evitar o aviso do navegador nesses outros domínios, o que parece ser o que você está sugerindo. Porque o aviso de navegador do SSL inválido ocorre antes .htaccess
é executado. O handshake SSL ocorre 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]
Assim, o acima não será realmente executado a partir de um navegador, a menos que o usuário aceite o aviso do certificado SSL (que eles não deveriam).
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
Em .htaccess
, isso resultaria em um redirecionamento inválido para qualquer coisa, exceto a raiz do documento, porque a referência de referência $1
não possui um prefixo de barra. Mesmo para o document root você deve realmente incluir uma barra à direita na substituição (embora o navegador irá implicitamente corrigir isso). Além disso, curioso por que você usou a variável de servidor REQUEST_URI
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 escapar de um ponto literal quando usado dentro de uma classe de caractere.
- Eu removi o
$
fim da âncora de cadeia na verificação de host para capturar o FQDN que inclui um ponto final. - Provavelmente, você desejará alterar esses redirecionamentos permanentes (301) depois de confirmar que eles estão funcionando bem. ie. altere
R
paraR=301
.