it-swarm-tr.com

Tüm HTTP istekleri HTTPS'ye nasıl yönlendirilir

Sitemdeki güvensiz HTTP isteklerini (ör. http://www.example.com) HTTPS'ye (https://www.example.com) yönlendirmeye çalışıyorum. PHP btw kullanıyorum. .Htaccess de bunu yapabilir miyim?

254
Cat

Güncelleme: Bu cevap birkaç yıl önce kabul edilmiş olsa da, yaklaşımının Apache belgelerine göre şimdi karşı önerilir olduğunu unutmayın. Bunun yerine Redirect kullanın. Bakınız bu cevap .


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

Kaynak

262
Reese Moore

Apache belgeleri , yeniden yazma kullanmamaya karşı önerilir:

http URL'lerini https dosyasına yeniden yönlendirmek için aşağıdakileri yapın:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Bu snippet, ana sunucu yapılandırma dosyasına, not 'a, .htaccess içine, sorulan soruya girmelidir.

Bu makale ancak soru sorulduktan ve cevaplandıktan sonra ortaya çıkmış olabilir, ancak şu anki yolunda görünüyor.

305
ssc

301 yönlendirmesi ile tavsiye ederim:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
124
David

Bu soruda söylediğim gibi, tüm HTTP isteklerini HTTPS eşdeğerlerine kör olarak yönlendirmekten kaçınmanızı öneririm, çünkü bu size yanlış bir güvenlik izlenimi verebilir. Bunun yerine, muhtemelen HTTP sitenizin "kökünü" HTTPS sitenizin köküne yönlendirmeli ve oradan da yalnızca HTTPS'ye yönlendirmelisiniz.

Sorun, HTTPS sitesindeki bir bağlantı veya formun istemcinin HTTP sitesine bir istek göndermesini sağlaması durumunda, içeriğinin yeniden yönlendirmeden önce görünür hale gelmesidir.

Örneğin, HTTPS üzerinden sunulan sayfalarınızdan birinde <form action="http://example.com/doSomething"> yazan ve açık bir şekilde gönderilmemesi gereken bazı veriler gönderen bir form varsa, tarayıcı ilk önce HTTP'ye tam isteği (varlık da POST da dahil) gönderir. önce site. Yönlendirme derhal tarayıcıya gönderilir ve çok sayıda kullanıcı uyarıları devre dışı bıraktığı veya yok saydığı için göz ardı edilmesi muhtemeldir.

Tabii ki, HTTPS sitesine olması gereken, ancak sonuçta HTTP sitesi için olması gereken bağlantıları sağlama hatası, HTTPS sitenizle aynı IP adresindeki HTTP portunda bir şeyler dinler dinlemez sorunlara neden olabilir. Ancak, iki siteyi bir "ayna" olarak tutmanın sadece hata yapma olasılığını artıracağını düşünüyorum, çünkü kullanıcıyı HTTPS'ye yönlendirerek kendini otomatik olarak düzelteceği varsayımını yapma eğiliminde olabilirsiniz. ( Bu soruda benzer tartışmalar yapıldı. )

33
Bruno

Alanında https ve www için en iyi yol olduğunu öğrendim

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
17
GiorgosK

Bu html yönlendirme yaklaşımı işe yarıyor ama en iyisi değil.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

PHP yaklaşımı

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess onayı

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

kopyalandı: www.letuslook.org

12
Timothy Nwanwene

Http'den https'ye yönlendirmenin bu yöntemini seviyorum. Çünkü her site için düzenlememe gerek yok.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
9
Cory

GoDaddy.com'a göre .htaccess kullanarak HTTP’yi HTTPS’ye yeniden yönlendirmenin doğru yöntemi budur. İlk kod satırı açıklayıcıdır. İkinci kod satırı, HTTPS'nin kapalı olup olmadığını kontrol eder ve eğer öyleyse, üçüncü kod satırını çalıştırarak HTTP'yi HTTPS'ye yönlendirir, aksi takdirde üçüncü kod satırı dikkate alınmaz.

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

6
AnarchyOutlaw

En iyi çözüm gereksinimlerinize bağlıdır. Bu, daha önce içerik eklenmiş olarak gönderilen cevapların bir özetidir.

Apache web sunucusuyla çalışıyorsanız ve yapılandırmasını değiştirebiliyorsanız, Apache belgelerini izleyin:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Ama ayrıca bir .htaccess dosyasında da yapıp yapamayacağınızı sordunuz. Bu durumda Apache'nin RewriteEngine :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L]

Her şey yolunda gidiyorsa ve tarayıcıların bu yönlendirmeyi hatırlamasını istiyorsanız, son satırı şu şekilde değiştirerek kalıcı olarak ilan edebilirsiniz:

RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Ancak bu yönlendirme konusundaki fikrinizi değiştirebilirseniz dikkatli olun. Tarayıcılar çok uzun süredir hatırlıyor ve değişip değişmediğini kontrol etmiyor.

Web sunucusu yapılandırmasına bağlı olarak ilk satır RewriteEngine On'ye ihtiyacınız olmayabilir.

Bir PHP çözümü arıyorsanız, $ _SERVER dizisi ve başlık işlevine bakın.

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']); 
} 
6
maikel

.Htaccess dosyanızda aşağıdaki kodu kullanmak, ziyaretçileri otomatik olarak sitenizin HTTPS sürümüne yönlendirir:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

Eğer bir .htaccess dosyanız varsa:

RewriteEngine On'u çoğaltmayın.

RewriteCond ve RewriteRule ile başlayan satırların mevcut olan RewriteEngine On'u hemen izlediğinden emin olun.

6
OpenWebWar

.Htaccess dosyasına aşağıdaki kodu ekleyin:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

[Etki alanı adınız] web sitenizin etki alanı adıdır.

Ayrıca, yukarıdaki kodun son satırını değiştirerek, belirli klasörleri etki alanı adınızdan yeniden yönlendirebilirsiniz:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
5
Rahul

Yönlendirme için yukarıda açıklanan her şeyi yapın. Başlığınıza "HTTP Sıkı Aktarım Güvenliği" eklemeniz yeterli. Bu orta saldırıda insanı önleyecektir.

Apache yapılandırma dosyanızı düzenleyin (örneğin /etc/Apache2/sites-enabled/website.conf ve /etc/Apache2/httpd.conf) ve aşağıdakileri VirtualHost'a ekleyin:

# 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

4
Waqas

Siteniz için Apache config'e doğrudan erişemediğiniz bir durumdaysanız, barındırılan birçok platform hala bu şekilde kısıtlıdır, o zaman aslında iki aşamalı bir yaklaşım öneririm. Apache'nin neden kendi yapılandırma seçeneklerini her şeyden önce HTTP'den HTTPS'ye mod_rewrite üzerinde kullanmanız gerektiğini belgelemesi.

İlk önce, yukarıda belirtildiği gibi, .htaccess mod_rewrite kurallarınızı kurarsınız:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Ardından, PHP dosyalarınızda (durumunuz için uygun olacağı her yerde bunu yapmanız gerekir, bazı siteler tüm istekleri tek bir PHP dosyası üzerinden yönlendirir; ihtiyaçları ve talepleri konusunda):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

Yukarıdakilerin, güvenli olmayan bir ortamda güvenli verileri potansiyel olarak gösterebilecek herhangi bir kod ÖNCE çalıştırılması gerekir. Bu nedenle, siteniz HTACCESS ve mod_rewrite üzerinden otomatik yönlendirmeyi kullanır, komut dosyalarınız HTTPS üzerinden erişilmediğinde çıktı sağlanmamasını sağlar.

Sanırım çoğu insan böyle düşünmüyor ve Apache bu yöntemi mümkün olduğunca kullanmamanızı tavsiye ediyor. Ancak, kullanıcı verilerinizin güvende olduğundan emin olmak için geliştirme ucunda ek bir kontrol yeterlidir. Umarım bu, barındırma hizmetlerimizdeki kısıtlamalar nedeniyle, önerilmeyen yöntemleri kullanmayı düşünmesi gereken birine yardımcı olur.

3
F. Scott Gale

.Htaccess aracılığıyla Bu yardımcı olacaktır.

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]

Ayrıca, Daha Fazla Detay için buna bakın. Http'yi Https'ye Nasıl Yönlendiririm?

2
Roshan Padole

Mod_rewrite başka şeyler için gerekmedikçe, Apache core IF yönergesini kullanmak daha temiz ve hızlıdır:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

IF yönergesine, www öneki olmadan tek bir kurallı etki alanı sağlama gibi daha fazla koşul ekleyebilirsiniz:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

Her şey için mod_rewrite kullanarak bir çok tanıdık atalet var, ama bunun sizin için çalışıp çalışmadığını görmek.

Daha fazla bilgi: https://httpd.Apache.org/docs/2.4/mod/core.html#if

Eylemde görmek için (www. Veya https: // olmadan veya .com yerine .net ile deneyin): https://nohodental.com/ (üzerinde çalıştığım bir site).

2
SashaK

Tüm http isteklerini https 'e yönlendirmek için kullanabilirsiniz:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [NE,L,R]

Mod-rewrite etkin değilse ve Apache 2.4’ün içindeyseniz, Redirect isteklerini if dizinine yönlendirmek için bir http inside https yönergesi de kullanabilirsiniz.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
2
starkeen

Sitemin tüm sayfalarını http için benim için çalışan https sayfalarının analoguna yönlendirmek için bir yöntem buldum.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
1
Oleg Apanovich

Apache kullanıyorsanız, mod_rewrite en kolay çözümdür ve çevrimiçi olarak bunun nasıl yapılacağı konusunda pek çok belge vardır. Örneğin: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

Tomcat sunucusundan yapmak istiyorsanız aşağıdaki adımları izleyin.

Bağımsız bir Apache Tomcat (8.5.x) HTTP Sunucusunda, bir kullanıcı www.domain.com yazdığında, otomatik olarak https (www.domain.com) sitesine yönlendirilir.

Aşağıdakileri kapama etiketinden önce [Tomcat_base] /conf/web.xml dosyasına dahil etmenin 2 adımlı yöntemi

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>

ve [Tomcat_base] /conf/server.xml bağlayıcı ayarlarının yapılması:

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>

Not: Zaten https yapılandırmasını yaptıysanız ve yönlendirmeye çalışıyorsanız yalnızca 1. adımı uygulayın.

0
Bhaskara Arani

Bu sorunun farklı bir kenarı, bir Yük Dengeleyicisinin devreye girmesidir. 

Durum şöyle: 

Bu nedenle, PHP veya Apache'deki tüm sunucu isteği değişkenleri bağlantının sadece HTTP olduğunu gösterir. Sunucudaki HTTP ve HTTPS dizinleri aynıdır.

Onaylanan cevaptaki RewriteCondition çalışmıyor. .__ ya bir döngü verir ya da işe yaramadı. 

Soru: Bunun Yük Dengeleyici üzerinde çalışmasını sağlamak. 

(Ya da Yük Dengeleyici yanlış yapılandırılmış mı? Umduğum şey de bu çünkü sorunu WebHosting şirketine taşıyabilirim :-))

0
BertC

.htaccess dosyasına bu kodu al HTTP'yi otomatik olarak HTTPS'ye yönlendir

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

0
Ehsan Sattari

Benim için çalışıyor:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>

ve örneğin, http: // server/foo? email = birisi% 40example.com / normalde herhangi bir sorun yaşamadan yönlendirir .. Web sitesinin kök klasöründe yer alanKullanmak mümkündür RewriteCond% {SERVER_PORT}! ^ 443 $ yerine RewriteCond% {HTTPS}! On

0
Intacto
 Redirect 301 / https://example.com/

(yukarıdaki cevapların hiçbiri işe yaramazsa benim için çalıştı)

Bonus:

ServerAlias www.example.com example.com

(https: // www . example.com bulunamadı)

0
aalesund

Https trafiğini kabul eden ve http ile sunucularınıza yönlendiren bir Amazon Web Hizmetleri Elastik Yük Dengeleyici kullanıyorsanız, tüm http trafiğini https'ye yönlendirmenin doğru yolu burada açıklanmaktadır: https: // aws. Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

Her zaman yük dengeleyiciden gelen http isteklerine dahil olan X-Forward-Proto başlığını kullanın (http veya https içerir): https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/ x iletilen-headers.html

Httpd.conf dosyasında:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

Veya root .htaccess dosyanızda:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Bonus: Yerel geliştirme makinenizdeki http trafiğini yönlendirmeye çalışmaz.

0
ScottyB