Как я могу заставить пользователей получать доступ к моей странице через 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 ]

1 голос
/ 27 октября 2018

PHP-путь:

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit(1);
}

Способ Apache mod_rewrite:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
1 голос
/ 06 апреля 2017

Для тех, кто использует IIS, добавление этой строки в web.config поможет:

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
         </rule>
    </rules>
</rewrite>

Полный пример файла

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>
1 голос
/ 17 августа 2016

Использование этого недостаточно:

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}

Если у вас есть какой-либо контент http (например, внешний источник изображения http), браузер обнаружит возможную угрозу. Поэтому убедитесь, что все ваши ref и src внутри вашего кода являются https

1 голос
/ 03 августа 2016

Если вы используете Apache или что-то вроде LiteSpeed, которое поддерживает файлы .htaccess, вы можете сделать следующее. Если у вас еще нет файла .htaccess, вам следует создать новый файл .htaccess в корневом каталоге (обычно там, где находится ваш index.php). Теперь добавьте эти строки как первые правила перезаписи в ваш .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Вам нужна только одна инструкция "RewriteEngine On" в вашем .htaccess для всех правил перезаписи, поэтому, если она у вас уже есть, просто скопируйте вторую и третью строку.

Надеюсь, это поможет.

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

Не смешивайте HTTP и HTTPS на одной странице. Если у вас есть страница формы, которая обслуживается через HTTP, я буду нервничать по поводу отправки данных - я не могу увидеть, идет ли отправка по HTTPS или HTTP, не выполняя View Source и не ища его. *

Обслуживание формы по HTTPS вместе со ссылкой на отправку не так уж сложно для преимущества.

0 голосов
/ 17 апреля 2018

может быть, это может помочь, вы, вот как я сделал для моего сайта, он работает как шарм:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}
0 голосов
/ 31 августа 2016

Я прошел через множество решений с проверкой состояния $ _ SERVER [HTTPS] , но кажется, что это ненадежно, потому что иногда он не устанавливается или не включается, не выключается и т. Д., Вызывая сценарий к внутреннему перенаправлению цикла.

Вот наиболее надежное решение, если ваш сервер поддерживает $ _ SERVER [SCRIPT_URI]

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]'>";
    exit;
}

Обратите внимание, что в зависимости от вашей установки ваш сервер может не поддерживать $ _SERVER [SCRIPT_URI], но если это так, этот сценарий лучше использовать.

Вы можете проверить здесь: Почему некоторые установки PHP имеют $ _SERVER ['SCRIPT_URI'], а другие нет

0 голосов
/ 26 июля 2016

Я использовал этот скрипт, и он хорошо работает на сайте.

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    enter code hereheader('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}
0 голосов
/ 17 сентября 2008

Вы не должны по соображениям безопасности. Особенно, если здесь есть файлы cookie. Это оставляет вас широко открытыми для атак воспроизведения на основе файлов cookie.

В любом случае, вы должны использовать правила управления Apache для его настройки.

Затем вы можете проверить, включен ли HTTPS, и перенаправлять по мере необходимости.

Вы должны перенаправить на страницу оплаты только с помощью FORM POST (без получения), и доступ к странице без POST должен быть направлен обратно на другие страницы. (Это поймает людей просто прыгающими.)

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

Это хорошее место для начала, извиняюсь за то, что не предоставил больше. Но вы действительно должны протолкнуть все через SSL.

Это чрезмерно защищает, но, по крайней мере, у вас меньше забот.

0 голосов
/ 29 сентября 2014
<?php 
// Require https
if ($_SERVER['HTTPS'] != "on") {
    $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
    header("Location: $url");
    exit;
}
?>

Это просто.

...