Как я могу заставить пользователей получать доступ к моей странице через HTTPS вместо HTTP? - PullRequest
127 голосов
/ 17 сентября 2008

У меня есть только одна страница, которую я хочу заставить быть доступной как страница HTTPS (PHP на Apache). Как мне сделать это, не заставляя весь каталог требовать HTTPS? Или, если вы отправляете форму на страницу HTTPS со страницы HTTP, она отправляет ее по HTTPS вместо HTTP?

Вот мой пример:

http://www.example.com/some-page.php

Я хочу, чтобы он был доступен только через:

https://www.example.com/some-page.php

Конечно, я могу поместить все ссылки на эту страницу, указывающие на версию HTTPS, но это не мешает некоторым дуракам получить доступ к ней через HTTP специально ...

Одна вещь, которую я подумал, это поместить перенаправление в заголовок файла PHP, чтобы убедиться, что они обращаются к версии HTTPS:

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

Но это не может быть правильным путем, не так ли?

Кстати, пожалуйста, не обращайте внимания на URL. Я знаю, что если бы это была действительно страница с корзиной для покупок и т. Д., Вы бы сделали это по-другому. Думайте об этом как о странице с сайта, который продает один товар за одну цену, где вы вводите информацию о своей кредитной карте, которая будет отправлена ​​в платежный шлюз на внешнем сайте для явной цели зарядки вашей карты один раз.

Ответы [ 20 ]

166 голосов
/ 17 сентября 2008

То, как я делал это раньше, в основном похоже на то, что вы написали, но не имеет жестко закодированных значений:

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}
45 голосов
/ 17 сентября 2008

Вы можете сделать это с помощью директивы и mod_rewrite на Apache:

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Location>

Вы можете сделать Местоположение умнее с течением времени, используя регулярные выражения , если хотите.

36 голосов
/ 27 августа 2012

Вы должны заставить клиента запрашивать HTTPS всегда с HTTP Strict Transport Security (HSTS) заголовки:

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

Обратите внимание, что HSTS поддерживается в большинстве современных браузеров, но не универсален. Таким образом, приведенная выше логика вручную перенаправляет пользователя независимо от поддержки, если он оказывается в HTTP, и затем устанавливает заголовок HSTS так, чтобы дополнительные запросы клиента были перенаправлены браузером, если это возможно.

14 голосов
/ 23 июня 2015

Я только что создал файл .htaccess и добавил:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Простой!

9 голосов
/ 23 декабря 2010
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}
7 голосов
/ 19 декабря 2014

Пришлось сделать что-то подобное, когда бежал за балансировщиком нагрузки. Наконечник шляпы https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}
5 голосов
/ 28 декабря 2012

http://www.besthostratings.com/articles/force-ssl-htaccess.html

Иногда вам может потребоваться убедиться, что пользователь просматривает ваш сайт через защищенное соединение. Простой способ всегда перенаправить пользователя на защищенное соединение (https://) может быть выполнено с помощью файла .htaccess, содержащего следующие строки:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Обратите внимание, что файл .htaccess должен находиться в главной папке веб-сайта.

Если вы хотите использовать HTTPS для конкретной папки, вы можете использовать:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

Файл .htaccess должен быть помещен в папку, в которой необходимо принудительно установить HTTPS.

5 голосов
/ 05 июня 2015

Ладно .. Теперь есть масса вещей на этом сейчас, но никто не заканчивает «Безопасный» вопрос. Для меня нелегко использовать что-то небезопасное.

Если вы не используете его в качестве приманки.

$ _ Распространение SERVER может быть изменено по желанию того, кто знает, как.

Также, как заявили Саззад Тушар Хан и thebigjc, вы также можете использовать httaccess для этого, и здесь есть много ответов, содержащих его. Просто добавьте:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

до конца того, что у вас есть в вашем .httaccess и вот что.

Тем не менее, мы не настолько безопасны, как могли бы быть с этими двумя инструментами.

Остальное просто. Если отсутствуют атрибуты, например ...

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_HOST'],"mywebsite.com") === FALSE){// Something is FISHY
}


Также скажите, что вы обновили файл httaccess и проверили:

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

Есть намного больше переменных, которые вы можете проверить, т.е. ..

HOST_URI (если есть статические атрибуты для проверки)

HTTP_USER_AGENT (в том же сеансе разные значения)

Так что все, что я говорю, это не просто соглашайтесь на одно или другое, когда ответ лежит в комбинации.

Для получения дополнительной информации о переписывании httaccess см. Документацию-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

Некоторые стеки здесь -> Принудительное использование SSL / https с использованием .htaccess и mod_rewrite
и
Получение полного URL текущей страницы (PHP)
назвать пару.

3 голосов
/ 05 декабря 2017

использование htaccess:

#if domain has www. and not https://
  RewriteCond %{HTTPS} =off [NC]
  RewriteCond %{HTTP_HOST} ^(?i:www+\.+[^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]

#if domain has not www.
  RewriteCond %{HTTP_HOST} ^([^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]
3 голосов
/ 17 сентября 2008

Используйте $_SERVER['HTTPS'], чтобы узнать, является ли он SSL , и перенаправьте в нужное место, если нет.

И помните, что страница, которая отображает форму, не нуждается в подаче через HTTPS, больше всего она нужна URL-адресу обратной ссылки.

Редактировать : да, как указано ниже, лучше иметь весь процесс в HTTPS. Это гораздо более обнадеживающе - я указывал на то, что этот пост - самая важная часть. Кроме того, вам нужно позаботиться о том, чтобы все файлы cookie были защищены, поэтому они будут отправляться только через SSL. Решение mod_rewrite также очень изящно, я использовал его для защиты многих приложений на моем собственном веб-сайте.

...