PHP'de özel .htaccess ve mod_rewrite sayfasını kullanarak SSL / https'ye nasıl zorlayabilirim.
PHP'de özel .htaccess ve mod_rewrite sayfasını kullanarak SSL / https'ye nasıl zorlayabilirim.
Yanıtlar:
Apache mod_ssl
için SSL'yi aşağıdakilerle zorlamak için kullanabilirsiniz SSLRequireSSL Directive
:
Bu yönerge, geçerli bağlantı için SSL üzerinden HTTP (HTTPS) etkinleştirilmedikçe erişimi yasaklar. Bu, SSL etkin sanal ana makinenin veya dizinlerin içinde, korunması gereken şeyleri ortaya çıkaran yapılandırma hatalarına karşı savunmak için çok kullanışlıdır. Bu direktif mevcut olduğunda SSL kullanmayan tüm istekler reddedilir.
Bu, https'ye bir yönlendirme yapmayacaktır. Yeniden yönlendirmek için, mod_rewrite
.htaccess dosyanızda aşağıdakileri deneyin
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
veya verilen çeşitli yaklaşımlardan herhangi biri
Sağlayıcınızın .htaccess'i devre dışı bırakmış olması durumunda bunu PHP içinden de çözebilirsiniz (bu istemediğinizden beri olası değildir, ancak yine de)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
%{HTTP:X-Forwarded-Proto}
veya %{HTTP:X-Real-Port}
değişkenleri kullanmak isteyebilirsiniz .
RewriteRule <input-pattern> <output-url>
. Bu nedenle, alanın orada olması gerekir ve single ^
sadece "tüm giriş URL'leriyle eşleştir" der.
mod_rewrite
Proxy ve proxy olmayan sunucular için iyi çalışan bir çözüm buldum .
Eğer kullanıyorsanız CloudFlare, AWS Elastik Yükü Dengeleme, Heroku, OpenShift veya başka herhangi Bulut / PaaS çözümü ve karşılaştığınız yönlendirme döngüler normal HTTP yönlendirmeleri ile, yerine aşağıdaki pasajı deneyin.
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Doğrudan Gordon'un çok kapsamlı cevabından ödünç alarak, sorunuzun HTTPS / SSL bağlantılarını zorlamada sayfaya özgü olduğunu belirtiyorum.
function forceHTTPS(){
$httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( count( $_POST )>0 )
die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
if( !headers_sent() ){
header( "Status: 301 Moved Permanently" );
header( "Location: $httpsURL" );
exit();
}else{
die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
}
}
}
Daha sonra, PHP aracılığıyla bağlanmaya zorlamak istediğiniz bu sayfaların üst kısmına yakın olarak, require()
bu (ve diğer) özel işlevleri içeren merkezi bir dosya oluşturabilir ve ardından forceHTTPS()
işlevi çalıştırabilirsiniz .
Ben şahsen bu tür bir çözüm uygulamadı (basitlik için yukarıdaki gibi PHP çözümünü kullanma eğiliminde), ama aşağıdaki, en azından, iyi bir başlangıç olabilir.
RewriteEngine on
# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_METHOD} !^POST$
?
RewriteCond %{REQUEST_METHOD} !^POST$
, POST gönderimlerinin bu yönlendirmelerden etkilenmesini önlemelidir.
Mod-yeniden yazma tabanlı çözüm:
Aşağıdaki kodu htaccess içinde kullanmak tüm http isteklerini otomatik olarak https'ye iletir.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
Bu, www olmayan ve www http isteklerinizi https'nin www sürümüne yönlendirir .
Başka bir çözüm (Apache 2.4 *)
RewriteEngine on
RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
2.4'ten beri mod-rewrite'a% {REQUEST_SCHEME} değişkeni eklendiğinden bu, apache'nin alt sürümlerinde çalışmaz.
Sadece dizin derinliklerinde birden çok .htaccess dosyası kullanırken Apache'nin en kötü kalıtım kurallarına sahip olduğunu belirtmek isterim . İki önemli tuzak:
RewriteOptions InheritDownBefore
değiştirmek için yönerge (veya benzeri) belirtmeniz gerekir . (soruya bakın)Bu araçlar önerdi küresel çözüm Apache Wiki yok değil sen alt dizinleri başka .htaccess dosyalarını kullanıyorsanız çalışır. Ben değiştirilmiş bir sürümü yazdı:
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
Basit ve Kolay, sadece aşağıdakileri ekleyin
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Basit olan :
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
url'nizi example.com ile değiştirin
SSL'yi sadece Apache .htaccess ile zorlamak için kullanabilirsiniz
SSLOptions +StrictRequire
SSLRequireSSL
yönlendirme için yukarıdaki cevap doğrudur
bu kodu deneyin, URL'lerin tüm sürümlerinde çalışacaktır.
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]