Estou tentando redirecionar todas as solicitações HTTP inseguras no meu site (por exemplo http://www.example.com
) para HTTPS ( https://www.example.com
). Estou usando o PHP btw. Posso fazer isso no .htaccess?
http://
Estou tentando redirecionar todas as solicitações HTTP inseguras no meu site (por exemplo http://www.example.com
) para HTTPS ( https://www.example.com
). Estou usando o PHP btw. Posso fazer isso no .htaccess?
http://
Respostas:
Atualização: Embora esta resposta tenha sido aceita há alguns anos, observe que sua abordagem agora é recomendada pela documentação do Apache. Use um em Redirect
vez disso. Veja esta resposta .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
redirecionamentos para, https://server/foo?email=someone%2540example.com
ou seja, o sinal "@" são citados por URL duas vezes . O uso do método na resposta da @ ssc não possui esse problema.
In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Os documentos do Apache recomendam não usar uma reescrita:
Para redirecionar
http
URLs parahttps
, faça o seguinte:<VirtualHost *:80> ServerName www.example.com Redirect / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com # ... SSL configuration goes here </VirtualHost>
Este trecho deve ir em arquivo de configuração do servidor principal, não em .htaccess
como solicitado na pergunta.
Este artigo pode ter surgido somente depois que a pergunta foi feita e respondida, mas parece ser o caminho atual.
permanent
palavra - chave, o efeito será o mesmo (o navegador receberá um redirecionamento 301). Por exemplo:Redirect permanent "/" "https://example.com"
Eu recomendo com o redirecionamento 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
Como eu estava dizendo nesta pergunta , sugiro que você evite redirecionar todas as solicitações HTTP para seus equivalentes HTTPS às cegas, pois isso pode causar uma falsa impressão de segurança. Em vez disso, você provavelmente deve redirecionar a "raiz" do seu site HTTP para a raiz do site HTTPS e vincular a partir daí, apenas para HTTPS.
O problema é que, se algum link ou formulário no site HTTPS fizer com que o cliente envie uma solicitação ao site HTTP, seu conteúdo estará visível antes do redirecionamento.
Por exemplo, se uma de suas páginas veiculadas em HTTPS tiver um formulário que diga <form action="http://example.com/doSomething">
e envie alguns dados que não devem ser enviados de forma clara, o navegador primeiro enviará a solicitação completa (incluindo a entidade, se for um POST) para o site HTTP primeiro. O redirecionamento será enviado imediatamente ao navegador e, como um grande número de usuários desabilita ou ignora os avisos, é provável que seja ignorado.
Obviamente, o erro de fornecer os links que deveriam ser para o site HTTPS, mas que acabam sendo para o site HTTP, pode causar problemas assim que você ouvir algo na porta HTTP no mesmo endereço IP do seu site HTTPS. No entanto, acho que manter os dois sites como um "espelho" só aumenta as chances de cometer erros, pois você pode supor que ele se auto-corrigirá redirecionando o usuário para HTTPS, embora muitas vezes seja tarde demais. (Houve discussões semelhantes nesta pergunta. )
Descobri que a melhor maneira de https e www no domínio é
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
http://www.example.com/...
porque as duas condições estão implicitamente AND. Eles deveriam ser OR'd, ou seja. inclua a OR
flag na primeira condição (e lembre-se de escapar dos pontos literais na regex). Mas se você estiver implementando HSTS então você não quer redirecionar para HTTPS e www em um único redirecionamento, você deve redirecionar para HTTPS primeiro .
Essa é a abordagem de redirecionamento de html, funciona, mas não é a melhor.
<meta http-equiv="Refresh" content="0;URL=https://www.example.com" />
Abordagem PHP
<?php
function redirectTohttps() {
if ($_SERVER['HTTPS']!="on") {
$redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
header("Location:$redirect");
}
}
?>
.htaccess approch
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
copiado de: www.letuslook.org
.htaccess
vai? Além disso, esse link está morto.
Eu gosto deste método de redirecionamento de http para https. Porque não preciso editá-lo para cada site.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
O uso do código a seguir no arquivo .htaccess redireciona automaticamente os visitantes para a versão HTTPS do seu site:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Se você possui um arquivo .htaccess:
Não duplique RewriteEngine On.
Verifique se as linhas que começam RewriteCond e RewriteRule seguem imediatamente o RewriteEngine já existente ativado.
Esse é o método adequado para redirecionar HTTP para HTTPS usando .htaccess, de acordo com o GoDaddy.com. A primeira linha de código é auto-explicativa. A segunda linha de código verifica se o HTTPS está desativado e, se estiver, redireciona o HTTP para o HTTPS executando a terceira linha de código, caso contrário, a terceira linha de código é ignorada.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
https://www.godaddy.com/help/redirect-http-to-https-automatically-8828
A melhor solução depende dos seus requisitos. Este é um resumo das respostas postadas anteriormente, com algum contexto adicionado.
Se você trabalha com o servidor da web Apache e pode alterar sua configuração, siga a documentação do Apache :
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
Mas você também perguntou se pode fazê-lo em um .htaccess
arquivo. Nesse caso, você pode usar o RewriteEngine do Apache :
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Se tudo estiver funcionando bem e você desejar que os navegadores se lembrem desse redirecionamento, você pode declarar como permanente alterando a última linha para:
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Mas tome cuidado se você mudar de idéia nesse redirecionamento. Os navegadores lembram-no por muito tempo e não verificam se foi alterado.
Você pode não precisar da primeira linha, RewriteEngine On
dependendo da configuração do servidor da web.
Se você procurar uma solução PHP, observe a matriz $ _SERVER e a função do cabeçalho :
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
.htaccess
arquivo?
Adicione o seguinte código ao arquivo .htaccess:
Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]
Onde [seu nome de domínio] é o nome de domínio do seu site.
Você também pode redirecionar pastas específicas para fora do seu nome de domínio, substituindo a última linha do código acima por:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Faça tudo o que é explicado acima para redirecionar. Basta adicionar "HTTP Strict Transport Security" ao seu cabeçalho. Isso evitará o homem no ataque do meio.
Edite seu arquivo de configuração do apache (/etc/apache2/sites-enabled/website.conf e /etc/apache2/httpd.conf, por exemplo) e adicione o seguinte ao seu VirtualHost:
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
Para redirecionar todas as http
solicitações para https
, você pode usar:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
Se mod-rewrite não estiver ativado e você estiver no apache 2.4, também poderá usar uma diretiva Redirect
interna if
para redirecionar http
solicitações https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Se você estiver em uma situação em que não pode acessar a configuração do apache diretamente para o seu site, que muitas plataformas hospedadas ainda estão restritas dessa maneira, eu recomendaria uma abordagem em duas etapas. A razão pela qual o próprio Apache documenta que você deve usar suas opções de configuração antes de mais nada sobre o mod_rewrite para HTTP para HTTPS.
Primeiro, como mencionado acima, você configuraria suas regras .htaccess mod_rewrite:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Então, no (s) seu (s) arquivo (s) PHP (você precisa fazer isso sempre que for apropriado para a sua situação, alguns sites canalizarão todas as solicitações através de um único arquivo PHP, outros servirão várias páginas, dependendo de suas necessidades e da solicitação feita ):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
O item acima precisa executar ANTES de qualquer código que possa expor potencialmente os dados seguros em um ambiente não seguro. Assim, seu site usa o redirecionamento automático via HTACCESS e mod_rewrite, enquanto seus scripts garantem que nenhuma saída seja fornecida quando não for acessada por HTTPS.
Acho que a maioria das pessoas não pensa assim e, portanto, o Apache recomenda que você não use esse método sempre que possível. No entanto, basta uma verificação extra no final do desenvolvimento para garantir que os dados do usuário estejam seguros. Esperamos que isso ajude alguém que possa ter que usar métodos não recomendados devido a restrições nos nossos serviços de hospedagem.
Através do .htaccess Isso ajudará.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Além disso, consulte isso para obter mais detalhes. Como redirecionar Http para Https?
A menos que você precise de mod_rewrite para outras coisas, o uso da diretiva IF principal do Apache é mais limpa e rápida:
<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>
Você pode adicionar mais condições à diretiva IF, como garantir um único domínio canônico sem o prefixo www:
<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>
Há muita inércia de familiaridade no uso de mod_rewrite para tudo, mas veja se isso funciona para você.
Mais informações: https://httpd.apache.org/docs/2.4/mod/core.html#if
Para vê-lo em ação (tente sem www. Ou https: // ou com .net em vez de .com): https://nohodental.com/ (um site em que estou trabalhando).
leve esse código para o seu arquivo .htaccess Redirecione HTTP para HTTPS automaticamente
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Encontrei um método para forçar o redirecionamento de todas as páginas do site de http para analógico de páginas em https que funcionam para mim.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Isso redireciona todos os URLs para https e www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Se você quiser fazer isso no servidor tomcat, siga as etapas abaixo
Em um servidor HTTP independente do Apache Tomcat (8.5.x), como configurá-lo para que, se um usuário digitar www.domain.com, ele seja encaminhado automaticamente para o site https (www.domain.com).
O método de duas etapas para incluir o seguinte em seu [Tomcat_base] /conf/web.xml antes da tag de fechamento
step 1:
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
e definindo as configurações do conector [Tomcat_base] /conf/server.xml:
step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>
Nota: Se você já fez a configuração https e está tentando redirecionar, execute apenas a etapa 1.
Se você estiver usando o Apache, o mod_rewrite é a solução mais fácil e possui muita documentação online sobre como fazer isso. Por exemplo: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Uma vantagem diferente para esse problema é quando um Load Balancer entra em jogo.
A situação é a seguinte: - O tráfego do navegador para o Load Balancer, e vice-versa, é (deveria ser) HTTPS - O tráfego entre o Load Balancer e o WebServer real é HTTP.
Portanto, todas as variáveis de solicitação do servidor no PHP ou Apache mostram que a conexão é apenas HTTP. E os diretórios HTTP e HTTPS no servidor são os mesmos.
O RewriteCondition na resposta aprovada não funciona. Dá um loop ou simplesmente não funciona.
A pergunta é: como fazer isso funcionar em um balanceador de carga.
(Ou o Load Balancer está configurado incorretamente. Qual é o que eu estou esperando, porque então eu posso passar o problema para a empresa WebHosting :-))
Se você estiver usando um Elastic Load Balancer da Amazon Web Services que aceite tráfego https e o direcione para seu servidor com http, a maneira correta de redirecionar todo o tráfego http para https é descrita aqui: https://aws.amazon. com / premiumsupport / centro de conhecimento / redirecionar-http-https-elb
Use o cabeçalho X-Forwarded-Proto (contém http ou https), sempre incluído nas solicitações http do balanceador de carga, conforme descrito aqui: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- forwarded-headers.html
No arquivo httpd.conf:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
Ou no seu arquivo .htaccess raiz:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Bônus: ele não tentará redirecionar o tráfego http na sua máquina de desenvolvimento local.
Funciona para mim:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
e, por exemplo, http: // server / foo? email = alguem% 40example.com redireciona normalmente sem problemas. O arquivo .htaccess localizado na pasta raiz do site (por exemplo, public_html). É possível usar RewriteCond% {SERVER_PORT}! ^ 443 $ em vez disso RewriteCond% {HTTPS}! On
httpd
, não do PHP.