Перенаправлення з HTTP на HTTPS з PHP


107

Я працюю на веб-сайті кошика, і я хотів би перенаправити користувача на сторінку HTTPS, коли він вводить свої платіжні дані та підтримуватиме HTTPS-з'єднання для наступних сторінок, поки він не вийде.

Що мені потрібно встановити на сервер (я використовую Apache) для цього, і як це перенаправлення можна зробити з PHP?

Відповіді:


247

Спробуйте щось подібне (має працювати для Apache та IIS):

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

5
Це працює не завжди. Я спробував використовувати його, і в масиві $ _SERVER не було елемента "https", через який він давав помилку "занадто багато переадресацій". Було б потрібно використовувати інший метод.
Usman Zaheer

5
Мені довелося тестувати, if( $_SERVER['HTTPS'] == "off")щоб цей код запрацював. Я думаю, це тому, що я на IIS, а не Apache, як на OP.
Нік Пікерінг

1
@NicholasPickering Jepp, $ _SERVER змінні можуть відрізнятися залежно від веб-серверів.
Рафаель Мішель

6
Примітка: die () або exit () може бути важливим для перенаправлення заголовків, щоб запобігти виконанню решти сторінки (і, можливо, надсиланню додаткової інформації клієнтові) (тобто хакерам чи браузерам, які можуть не поважати заголовок).
dajon

3
Залежно від середовища / налаштування вашого сервера, вам може знадобитися використовувати $ _SERVER ['HTTP_X_FORWARDED_PROTO'], щоб перевірити наявність http / https
Девід Мейстер

19

Це хороший спосіб зробити це:

<?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();
}
?>

1
добре працює той, який позначений як хороший, буде надто багато разів повертати переадресацію принаймні в Chrome
Thomas J Younsi

Умова !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'завжди буде помилковою, оскільки якщо остання частина правдива, перша буде хибною.
Макс

@Max: Я не розумію, що ти кажеш. Якщо друга умова є істинною ($ _SERVER ['HTTPS'] == 'on'), тоді першою умовою також має бути ІСТИНА (звичайно, що змінна сервера встановлена, оскільки вона містить значення!)
OMA

7

Перенаправлення з HTTP на HTTPS з PHP на IIS

У мене виникли проблеми з перенаправленням на HTTPS для роботи на сервері Windows, який працює у версії 6 інформаційних служб Інтернету MS (IIS) . Я більше звик працювати з Apache на хості Linux, тому я звернувся до Інтернету за допомогою, і це було найвищого питання щодо переповнення стека, коли я шукав "php перенаправлення http на https" . Однак обрана відповідь для мене не спрацювала.

Після деяких спроб та помилок я виявив, що для IIS $_SERVER['HTTPS']встановлено не offдля TLS-з'єднань. Я вважав, що наступний код повинен допомогти іншим користувачам IIS, які приходять до цього питання через пошукову систему.

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

Редагувати : З іншої відповіді на переповнення стека більш простим рішенням є перевірка if($_SERVER["HTTPS"] != "on").


13
@JakeSylvestre Ярмарок досить. Зважаючи на те, що це питання не позначене як apacheя, я опублікував цю відповідь на користь інших користувачів IIS (подібно до ситуації, в якій я був), які можуть натрапити на цю сторінку через пошукову систему. Я погоджуюся з думкою, що відповіді - на користь громади в цілому, а не лише на ОП.
Ентоні Геоґеган

6

Ви завжди можете використовувати

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

щоб перенаправити на збережену URL-адресу.

Але я б рекомендував це зробити за .htaccess та правилами переписання Apache.


13
Я завжди рекомендую перевірити $ _SERVER ['HTTPS'] перед перенаправленням.
Рафаель Мішель

$ _SERVER ['HTTPS'] не завжди встановлюється, але це гарна ідея, щоб перевірити раніше. Ось чому я рекомендую робити це за допомогою корисного правила перезапису в Apache, яке перенаправляє лише тоді, коли його немає на HTTPS.
powtac

Хоча Apache рекомендує не використовувати зайвий файл .htaccess (тому що він сповільнюється), а використовувати правила перезапису всередині * .conf Apache.
powtac

1

На моєму сервері AWS beanstalk я не бачу змінної $ _SERVER ['HTTPS']. Я бачу $ _SERVER ['HTTP_X_FORWARDED_PROTO'], який може бути або "http", або "https", тому якщо ви хостите на AWS, використовуйте це:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.