arquivo htaccess para executar regras específicas para diferentes domínios [duplicado]

1

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

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

Então - www.apples.com aparece o mesmo que apples.efruit.co.uk

e - www.bananas.co.uk aparecem da mesma forma que bananas.efruit.co.uk

etc

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

Todos os outros domínios não terão um 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 reescreva como apples.efruit.co.uk (acima de https como acima). No entanto, www. está bem se não for um domínio efruit.co.uk.

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

Aqui está o que eu 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]

O único aspecto que parece funcionar é forçar domínios do efruit.co.uk a serem servidos por https.

    
por Tom 01.03.2018 / 22:13

1 resposta

1

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 para R=301 .
por 02.03.2018 / 00:40