htaccess redireciona sem www e HTTP com o URL completo

1

Eu tenho essas regras .htaccess :

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST} [R=301,L]

Funciona bem ao redirecionar HTTP para HTTPS & não www para www no domínio principal, mas se um usuário for diretamente para um URL específico, eu quero redirecionar para https, www com o caminho completo do URL.

Por exemplo:

  • http://example.com/login deve redirecionar para https://www.example.com/login
  • http://www.example.com/login deve redirecionar para https://www.example.com/login
  • https://example.com/login deve redirecionar para https://www.example.com/login

Com as configurações atuais, ele só redireciona para https://www.example.com ou https://www.example.com/index.php , como posso conseguir isso?

    
por Aditia Rahman 24.04.2018 / 16:09

2 respostas

2

Como @GeraldSchneider mencionou nos comentários, suas diretivas estão na ordem errada. Os redirecionamentos externos (HTTP para HTTPS e não-www para www) precisam ser antes do front-controller, caso contrário eles simplesmente nunca serão processados para algo diferente do arquivo real solicitações de. (Seu front-controller roteia todas as solicitações desconhecidas para index.php e então para ).

No entanto, seus redirecionamentos também estão incorretos. Você está perdendo o "URL completo" da substituição , de modo que, na situação atual, ele sempre redirecionará de volta para a raiz do documento.

Então, tente algo como o seguinte:

RewriteEngine On

# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

# HTTP to HTTPS redirect
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# Non-www to www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]

Notas sobre as diretivas acima:

  • No controlador frontal, não há necessidade de capturar o caminho da URL (ou seja, (.*) ), se não estiver sendo usado na substituição . O QSA flag não é necessário aqui também - a string de consulta da solicitação é anexada por padrão.
  • Observe o $1 na RewriteRule susbstitution - essa é uma referência anterior ao caminho da URL capturado da solicitação (ou seja, a "URL completa"). Isso estava faltando em ambos os seus redirecionamentos.
  • Você estava perdendo os sinalizadores [R=301,L] do redirecionamento HTTP para HTTPS. Sem declarar explicitamente o código de status, isso resultaria em um redirecionamento 302 temporário e a reescrita continuaria. Se você pretende implementar o HSTS mais tarde, esses redirecionamentos precisam ser separados.

No entanto, se você tiver acesso à configuração do servidor e não pretender implementar o HSTS, consulte a resposta do @ HBruijn.

    
por 24.04.2018 / 17:01
0

O ideal é que você tenha acesso à configuração do servidor e não precise fazer redirecionamentos de um arquivo .htaccess , e o seu se torna um text book case em quando NÃO usar mod_rewrite onde você configura os redirecionamentos em entradas específicas do VirtualHost.

<VirtualHost *:80>
   # Redirect http://[www.]example.com/login to https://www.example.com/login
    ServerName www.example.com
    ServerAlias example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>


<VirtualHost *:443>
    # Redirect https://example.com/login to https://www.example.com/login
    ServerName example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/...
    ....
</VirtualHost>
    
por 24.04.2018 / 17:01