Jak mogę wymusić SSL / https używając .htaccess i strony mod_rewrite specyficznej dla PHP.
W przypadku Apache można użyć mod_ssl
do wymuszenia protokołu SSL za pomocą SSLRequireSSL Directive
:
Niniejsza dyrektywa zabrania dostępu, chyba że dla bieżącego połączenia włączony jest HTTP przez SSL (tj. HTTPS). Jest to bardzo przydatne w wirtualnym hoście lub katalogach z obsługą SSL do obrony przed błędami konfiguracji, które ujawniają elementy, które powinny być chronione. Gdy ta dyrektywa jest obecna, wszystkie żądania są odrzucane, które nie używają protokołu SSL.
Nie spowoduje to jednak przekierowania do https. Aby przekierować, spróbuj wykonać następujące czynności mod_rewrite
w pliku .htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
lub dowolne z różnych podejść podanych w
Możesz również rozwiązać ten problem z poziomu PHP, jeśli Twój dostawca wyłączył .htaccess (co jest mało prawdopodobne, ponieważ poprosiłeś o to, ale i tak)
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}
lub%{HTTP:X-Real-Port}
zmiennych, aby sprawdzić, czy protokół SSL jest włączony.RewriteRule <input-pattern> <output-url>
. Tak więc przestrzeń musi tam być, a singiel^
mówi „dopasuj wszystkie wejściowe adresy URL”.Znalazłem
mod_rewrite
rozwiązanie, które działa dobrze zarówno na serwerach proxy, jak i bez proxy.Jeśli korzystasz z CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift lub innego rozwiązania Cloud / PaaS i występują pętle przekierowań z normalnymi przekierowaniami HTTPS, wypróbuj następujący fragment kodu.
źródło
Rozwiązanie PHP
Pożyczając bezpośrednio z bardzo wyczerpującej odpowiedzi Gordona, zauważam, że twoje pytanie wspomina o specyfice strony w wymuszaniu połączeń HTTPS / SSL.
Następnie, jak najbliżej góry tych stron, które chcesz zmusić do połączenia przez PHP, możesz
require()
scentralizowany plik zawierający tę (i dowolną inną) funkcję niestandardową, a następnie po prostu uruchomić tęforceHTTPS()
funkcję.Rozwiązanie HTACCESS / mod_rewrite
Nie wdrożyłem tego rodzaju rozwiązania osobiście (zwykle używałem rozwiązania PHP, takiego jak powyższe, ze względu na jego prostotę), ale poniższe działania mogą być przynajmniej dobrym początkiem.
źródło
RewriteCond %{REQUEST_METHOD} !^POST$
?RewriteCond %{REQUEST_METHOD} !^POST$
powinna zapobiegać wpływowi tych przekierowań na zgłoszenia POST.Rozwiązanie oparte na modyfikacji przepisu:
Użycie następującego kodu w htaccess automatycznie przesyła wszystkie żądania http do https.
Spowoduje to przekierowanie twoich żądań innych niż www i www http do wersji www https.
Inne rozwiązanie (Apache 2.4 *)
Nie działa to na niższych wersjach apache, ponieważ zmienna% {REQUEST_SCHEME} została dodana do mod-rewrite od wersji 2.4.
źródło
Chciałbym tylko zauważyć, że Apache ma najgorsze reguły dziedziczenia, gdy używa się wielu plików .htaccess w różnych głębokościach katalogów. Dwie kluczowe pułapki:
RewriteOptions InheritDownBefore
dyrektywę (lub podobną), aby to zmienić. (patrz pytanie)Oznacza to, że zasugerował globalne rozwiązanie na Apache Wiki ma nie działać, jeśli używasz innych plików .htaccess w podkatalogów. Napisałem zmodyfikowaną wersję, która:
źródło
Proste i łatwe, wystarczy dodać następujące
źródło
Ten kod działa dla mnie
źródło
Prosty:
zamień swój adres URL na example.com
źródło
do wymuszania SSL przy pomocy Apache .htaccess, którego możesz użyć
w przypadku przekierowania powyższa odpowiedź jest poprawna
źródło
wypróbuj ten kod, będzie działać dla wszystkich wersji adresów URL, takich jak
http://www.website.com
źródło