Sitemdeki tüm güvensiz HTTP isteklerini http://www.example.com
HTTPS'ye ( https://www.example.com
) yönlendirmeye çalışıyorum . PHP btw kullanıyorum. Bunu .htaccess içinde yapabilir miyim?
http://
Sitemdeki tüm güvensiz HTTP isteklerini http://www.example.com
HTTPS'ye ( https://www.example.com
) yönlendirmeye çalışıyorum . PHP btw kullanıyorum. Bunu .htaccess içinde yapabilir miyim?
http://
Yanıtlar:
Güncelleme: Bu yanıt birkaç yıl önce kabul edilmiş olsa da, yaklaşımının artık Apache belgeleri tarafından önerildiğini unutmayın . Redirect
Bunun yerine bir kullanın. Bu cevaba bakınız .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
yönlendirmeler https://server/foo?email=someone%2540example.com
URL'den iki kez alıntılanır . @ Ssc'nin cevabındaki yöntemi kullanmanın bu sorunu yoktur.
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.
Apaçi dokümanlar yeniden yazmak kullanılmasına karşı tavsiye:
http
URL'leri şuraya yönlendirmekhttps
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 parçacık, ana sunucu yapılandırma dosyası içine gitmeli değil içine .htaccess
söz konusu sorulduğunda olarak.
Bu makale ancak soru sorulduktan ve cevaplandıktan sonra ortaya çıkmış olabilir, ancak şu anki geçerli yol gibi görünüyor.
permanent
Anahtar kelimeyi kullanırsanız, etki aynıdır (tarayıcı 301 yönlendirmesi alır). Örnek:Redirect permanent "/" "https://example.com"
301 yönlendirmesi ile tavsiye ederim:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
Bu soruda söylediğim gibi , tüm HTTP isteklerini HTTPS eşdeğerlerine körü körüne 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 dizinine yönlendirmeli ve oradan bağlantıyı yalnızca HTTPS'ye yönlendirmelisiniz.
Sorun, HTTPS sitesindeki bazı bağlantı veya formların istemcinin HTTP sitesine istek göndermesini sağlaması durumunda, içeriğinin yeniden yönlendirmeden önce görünür olmasıdır.
Örneğin, HTTPS üzerinden sunulan sayfalarınızdan birinde <form action="http://example.com/doSomething">
açık bir şekilde gönderilmemesi gereken bazı verileri söyleyen ve gönderen bir form varsa , tarayıcı önce tüm isteği (POST ise varlık dahil) HTTP sitesine gönderir ilk. Yeniden yönlendirme hemen tarayıcıya gönderilir ve çok sayıda kullanıcı uyarıları devre dışı bıraktığı veya yok saydığı için yoksayılması muhtemeldir.
Tabii ki, HTTPS sitesine olması gereken ancak HTTP sitesi için olan bağlantıları sağlama hatası, HTTPS sitenizle aynı IP adresindeki HTTP bağlantı noktasını dinleyen bir şey alır almaz sorunlara neden olabilir. Ancak, iki sitenin bir "ayna" olarak tutulması sadece hata yapma olasılığını arttırdığını düşünüyorum, çünkü kullanıcıyı HTTPS'ye yönlendirerek kendini otomatik olarak düzeltirken, genellikle çok geç. ( Bu soruda benzer tartışmalar vardı . )
Etki alanındaki https ve www için en iyi yolun
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
http://www.example.com/...
iki yönlendirme dolaylı olarak VE yöneldiğinden yönlendirme yapmayacaktır. Bunun yerine OR'lu olmalılar, yani. OR
ilk koşuldaki bayrağı ekleyin (ve normal ifadedeki değişmez noktalardan kaçmayı unutmayın). Eğer uyguladıklarını Ama eğer HSTS o zaman HTTPS ve tek yönlendirme www yönlendirme yapmak istemiyorum, HTTPS yönlendirmelidir ilk .
Bu, işe yarayan html yönlendirme yaklaşımıdır, ancak en iyisi değildir.
<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 yaklaşımı
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
kopyalandığı yer: www.letuslook.org
.htaccess
gidiyor? Ayrıca, bu bağlantı öldü.
Ben http https yönlendirmek için bu yöntemi seviyorum. Çünkü her site için düzenlememe gerek yok.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
.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]
Mevcut bir .htaccess dosyanız varsa:
RewriteEngine On'u kopyalamayın.
RewriteCond ve RewriteRule ile başlayan satırların hemen mevcut RewriteEngine Açık'ı izlediğinden emin olun.
Bu, GoDaddy.com'a göre .htaccess kullanarak HTTP'yi HTTPS'ye yönlendirmenin uygun yöntemidir. İ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'e yönlendirir, aksi takdirde üçüncü kod satırı yok sayılır.
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
En iyi çözüm gereksinimlerinize bağlıdır. Bu, bazı bağlamlar eklenmiş olarak daha önce 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>
Ancak bunu bir .htaccess
dosyada yapıp yapamayacağınızı da sordunuz . Bu durumda Apache'nin RewriteEngine'ini kullanabilirsiniz :
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Her şey yolunda giderse ve tarayıcıların bu yönlendirmeyi hatırlamasını istiyorsanız, son satırı şu şekilde değiştirerek kalıcı olarak bildirebilirsiniz:
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ancak bu yönlendirme konusunda fikrinizi değiştirebiliyorsanız dikkatli olun. Tarayıcılar bunu çok uzun bir süre hatırlar ve değişip değişmediğini kontrol etmez.
Web RewriteEngine On
sunucusu yapılandırmasına bağlı olarak ilk satıra ihtiyacınız olmayabilir .
Bir PHP çözümü arıyorsanız, $ _SERVER dizisine ve header işlevine bakın :
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
.htaccess
dosyaya başka neler gidebilir ?
Aşağıdaki kodu .htaccess dosyasına ekleyin:
Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]
Burada [alan adınız] web sitenizin alan adıdır.
Yukarıdaki kodun son satırını aşağıdaki ile değiştirerek belirli klasörleri alan adınızın dışına da yönlendirebilirsiniz:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Yönlendirme için yukarıda açıklanan her şeyi yapın. Başlığınıza "HTTP Sıkı Aktarım Güvenliği" ekleyin. Bu, orta saldırıdaki adamı önleyecektir.
Apache yapılandırma dosyanızı düzenleyin (örneğin /etc/apache2/sites-enabled/website.conf ve /etc/apache2/httpd.conf) ve VirtualHost'unuza aşağıdakileri 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
Tüm http
istekleri şuraya yönlendirmek için https
şunları kullanabilirsiniz:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
Mod-yeniden yazma etkin değilse ve apache 2.4 kullanıyorsanız, istekleri yeniden yönlendirmek için bir Redirect
iç if
yönerge http
kullanabilirsiniz https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Siteniz için doğrudan apache yapılandırmasına erişemediğiniz bir durumdaysanız, barındırılan birçok platform bu şekilde hala kısıtlıdır, o zaman aslında iki adımlı bir yaklaşım öneririm. Apache'nin kendilerinin öncelikle yapılandırma seçeneklerini HTTP ve HTTPS için mod_rewrite üzerinden kullanmanız gerektiğini belgelemelerinin nedeni.
İlk olarak, 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]
Daha sonra, PHP dosyalarınızda (durumunuz için uygun olan her yerde bunu yapmanız gerekir, bazı siteler tüm istekleri tek bir PHP dosyası aracılığıyla huniler, diğerleri ihtiyaçlarına ve yapılan isteğe bağlı olarak çeşitli sayfalar sunar ):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
Yukarıdakilerin güvenli olmayan bir ortamda güvenli verileri açığa çıkarabilecek herhangi bir kod ÖNCE çalıştırılması gerekir. Böylece, siteniz HTACCESS ve mod_rewrite üzerinden otomatik yeniden yönlendirme kullanırken, komut dosyalarınız HTTPS üzerinden erişilmediğinde hiçbir çıkışın sağlanmamasını sağlar.
Sanırım çoğu insan böyle düşünmüyor ve Apache bu yöntemi mümkün olan yerlerde kullanmamanızı tavsiye ediyor. Bununla birlikte, kullanıcı verilerinizin güvenli olduğundan emin olmak için geliştirme sonunda ek bir kontrol yapmanız yeterlidir. Umarım bu bizim barındırma hizmetleri kısıtlamaları nedeniyle tavsiye edilmeyen yöntemleri kullanarak bakmak zorunda olabilir başkasına yardımcı olur.
.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 Ayrıntı için buna bakın. Http'yi Https'ye nasıl yönlendirirsiniz?
Diğer şeyler için mod_rewrite 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 kullanımında çok fazla atalet ataleti vardır, ancak bunun sizin için işe yarayıp yaramadığına bakın.
Daha fazla bilgi: https://httpd.apache.org/docs/2.4/mod/core.html#if
Çalışırken görmek için (www yerine veya https: // veya .com yerine .net olmadan deneyin): https://nohodental.com/ (üzerinde çalıştığım bir site).
bu kodu size götürün .htaccess dosyası HTTP'yi HTTPS'ye otomatik olarak yönlendir
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Sitemin tüm sayfalarını http'den benim için çalışan https'deki sayfaların analoguna yönlendirmeye zorlayan bir yöntem buldum.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Bu, tüm URL'leri https ve www'ye yönlendirir
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]
Tomcat sunucusundan yapmak istiyorsanız aşağıdaki adımları izleyin
Bağımsız bir Apache Tomcat (8.5.x) HTTP Sunucusunda, kullanıcı www.domain.com yazdığında otomatik olarak https (www.domain.com) sitesine yönlendirilecek şekilde nasıl yapılandırılabilir.
Kapanış etiketinden önce [Tomcat_base] /conf/web.xml dosyasına aşağıdakileri 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: https yapılandırmasını zaten yaptıysanız ve yönlendirmeye çalışıyorsanız yalnızca 1. adımı uygulayın.
Apache kullanıyorsanız, mod_rewrite en kolay çözümdür ve bunu nasıl yapacağınız çevrimiçi olarak bir çok belgeye sahiptir. Örneğin: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Bu sorunun farklı bir kenarı, bir Yük Dengeleyicinin devreye girmesidir.
Durum şu şekildedir: - Tarayıcıdan Yük Dengeleyiciye ve arkadan gelen trafik HTTPS'dir - Yük Dengeleyici ile gerçek WebServer arasındaki trafik HTTP'dir.
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 yanıttaki RewriteCondition çalışmıyor. Ya bir döngü veriyor ya da çalışmıyor.
Soru: Bu bir Yük Dengeleyici üzerinde nasıl çalışır.
(Ya da Yük Dengeleyici yanlış yapılandırılmış. Bunu umuyorum, çünkü o zaman sorunu WebHosting şirketine taşıyabilirim :-))
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çıklanmıştır: https://aws.amazon. com / premiumsupport / bilgi-merkezi / yönlendirme-http-https elb
Yük dengeleyiciden her zaman http isteklerinde bulunan X-Forwarded-Proto başlığını (http veya https içerir), burada açıklandığı gibi kullanın: 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 kök .htaccess dosyanızda:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Bonus: http trafiğini yerel geliştirme makinenize yönlendirmeye çalışmaz.
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: // sunucu / foo? email = birisi% 40example.com herhangi bir sorun olmadan normal şekilde yeniden yönlendirir. Web sitesi kök klasöründe bulunan .htaccess dosyası (örneğin public_html olarak adlandırılır). Kullanmak mümkündür RewriteCond% {SERVER_PORT}! ^ 443 $ yerine RewriteCond% {HTTPS}! Üzerinde
httpd
PHP ile yapamazsınız (ve yapmalısınız) .