Pytanie Przekierowanie z HTTP na HTTPS z PHP


Pracuję nad stroną koszyka na zakupy i chciałbym przekierować użytkownika na stronę HTTPS, gdy wprowadzi szczegóły płatności i utrzyma połączenie HTTPS dla następnych stron, dopóki się nie wyloguje.

Co muszę zainstalować na serwerze (używam Apache), aby to zrobić, i jak można to przekierować z PHP?


76
2018-02-24 14:57


pochodzenie




Odpowiedzi:


Spróbuj czegoś takiego (powinno działać dla Apache i IIS):

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}

181
2018-02-09 16:22



To nie działa zawsze. Próbowałem go używać i nie było elementu "https" w tablicy $ _SERVER, co powodowało błąd "zbyt wielu przekierowań". Będzie musiał użyć innej metody. - Usman Zaheer
Musiałem przetestować if( $_SERVER['HTTPS'] == "off") aby ten kod zadziałał. Myślę, że to dlatego, że jestem na IIS, a nie Apache jak OP. - Nicholas Pickering
@NicholasPickering Jepp, zmienne $ _SERVER mogą się różnić w zależności od serwera. - Raphael Michel
Uwaga: funkcja die () lub exit () może być ważna po przekierowaniu nagłówka, aby uniemożliwić wykonanie reszty strony (i ewentualnie wysłanie dodatkowych informacji do klienta) (np. Hakerom lub przeglądarkom, które mogą nie respektować nagłówka). - user2533809
W zależności od środowiska / konfiguracji serwera może zajść potrzeba użycia $ _SERVER ['HTTP_X_FORWARDED_PROTO'] w celu sprawdzenia http / https - David Meister


Jest to dobry sposób na zrobienie tego:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>

9
2018-02-24 14:59



działa dobrze, ten oznaczony jako dobry zwróci przekierowanie zbyt wiele razy, przynajmniej w Chrome - Thomas J Younsi


Zawsze możesz użyć

header('Location: https://www.domain.com/cart_save/');

przekierować do URL-a zapisu.

Ale polecam zrobić to za pomocą .htaccess i reguł przepisywania Apache.


5
2017-11-27 18:04



Zawsze zalecałbym sprawdzanie $ _SERVER ['HTTPS'] przed przekierowaniem. - Raphael Michel
$ _SERVER ['HTTPS'] nie zawsze jest ustawiony, ale warto go wcześniej sprawdzić. Dlatego polecam zrobić to za pomocą użytecznej reguły przepisywania w Apache, która przekierowuje tylko wtedy, gdy nie jest w HTTPS. - powtac
Chociaż Apache zaleca, aby nie używać dodatkowego pliku .htaccess (ponieważ spowalnia), ale użyć reguł przepisywania wewnątrz * .conf Apache. - powtac


Przekierowanie z HTTP na HTTPS z PHP na IIS

Wystąpił problem z przekierowaniem do protokołu HTTPS w celu pracy na serwerze Windows który działa w wersji 6 Internetowe usługi informacyjne MS (IIS). Jestem bardziej używany do pracy z Apache na hoście Linux, więc zwróciłem się do Internetu na pomoc i było to pytanie o najwyższy ranking Stack Overflow, gdy szukałem dla "Php przekierować http do https". Jednak wybrana odpowiedź nie działa dla mnie.

Po kilku próbach i błędach odkryłem, że z IIS, $_SERVER['HTTPS'] jest Ustawić off dla połączeń innych niż TLS. Myślałem, że poniższy kod powinien pomóc innym użytkownikom IIS, którzy przychodzą na to pytanie za pośrednictwem wyszukiwarki.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

Edytować: Od drugiego Opcja przepełnienia stosu, prostszym rozwiązaniem jest sprawdzenie if($_SERVER["HTTPS"] != "on").


3



w porządku ... ale powiedział, że używa Apache - Jake Sylvestre
@JakeSylvestre Fair wystarczająco. Biorąc pod uwagę, że to pytanie nie jest oznaczone jako apache, Opublikowałem tę odpowiedź dla innych użytkowników IIS (podobnie jak w sytuacji, w której byłem), którzy mogą natknąć się na tę stronę za pośrednictwem wyszukiwarki. Zgadzam się z poglądem, że odpowiedzi są korzystne dla całej społeczności, a nie tylko PO. - Anthony Geoghegan