Перенаправление с 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, из-за которого он давал ошибку «слишком много перенаправлений». Придется использовать другой метод.
Усман Захир
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();
}
?>
Matiasg1982
источник
1
работает хорошо, тот, что отмечен как хороший, будет возвращать редирект слишком много раз, по крайней мере, в Chrome
Thomas J
Условие !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'всегда будет ложным, так как если последняя часть истинна, первая будет ложной.
Макс
@Max: Я не понимаю, что вы говорите. Если второе условие истинно ($ _SERVER ['HTTPS'] == 'on'), то первое условие также должно быть ИСТИННЫМ (конечно, эта серверная переменная установлена, потому что она содержит значение!)
OMA
7

Перенаправление с HTTP на HTTPS с помощью PHP в IIS

У меня возникли проблемы с перенаправлением на HTTPS для работы на сервере Windows, на котором работает версия 6 MS Internet Information Services (IIS) . Я больше привык работать с Apache на хосте Linux, поэтому я обратился за помощью в Интернет, и это был самый высокий вопрос о переполнении стека, когда я искал «php redirect 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.

Powtac
источник
13
Я всегда рекомендую проверять $ _SERVER ['HTTPS'] перед перенаправлением.
Рафаэль Мишель
$ _SERVER ['HTTPS'] не всегда устанавливается, но рекомендуется проверить это заранее. Вот почему я рекомендую сделать это с помощью полезного правила перезаписи в Apache, которое перенаправляет только тогда, когда он не на HTTPS.
powtac
Хотя Apache рекомендует не использовать дополнительный файл .htaccess (потому что он замедляется), а использовать правила перезаписи внутри * .conf Apache.
powtac
1

На моем сервере beanstalk AWS я не вижу переменную $ _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;
}
Феникс
источник