У меня есть только одна страница, на которую я хочу заставить обращаться как 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'); }
Но это не может быть правильным способом, не так ли?
BTW, не обращайте внимания на URL. Я знаю, что если бы это была страница, где была корзина для покупок и т. Д., Вы бы сделали это по-другому. Подумайте об этом как странице с сайта, который продает один товар за одну цену, когда вы вводите информацию о своей кредитной карте, которая должна быть отправлена на платежный шлюз на внешнем сайте, с одной стороны, для зарядки вашей карты.
То, как я это делал раньше, в основном похоже на то, что вы написали, но не имеет жестко заданных значений:
if ($ _ SERVER ["HTTPS"]! = "on") { header ("Location: https: //". $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]); Выход(); }
Вы можете сделать это с помощью директивы и mod_rewrite на Apache:
<Location /buyCrap.php> RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </Location>
Вы можете сделать местоположение более умным с течением времени, используя регулярные выражения, если хотите.
Вы должны заставить клиента запрашивать 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, чтобы, если это возможно, перенаправление последующих клиентских запросов браузером.
Я только что создал файл .htaccess и добавил:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Просто !
// 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); }
http://www.besthostratings.com/articles/force-ssl-htaccess.html
Иногда вам может потребоваться убедиться в том, что пользователь просматривает ваш сайт через соединение securte. Простой способ всегда перенаправлять пользователя на безопасное соединение (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.
Придется делать что-то подобное при работе за балансиром нагрузки. Кончик шляпы 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; } }
Хорошо. Теперь в этом есть много вещей, но никто не завершает «безопасный» вопрос. Для меня смешно использовать то, что небезопасно.
Если вы не используете его в качестве приманки.
Распространение $ _SERVER может быть изменено по желанию того, кто знает, как это сделать.
Также, как сказал Саззад Тушар Хан и thebigjc, вы также можете использовать httaccess для этого, и здесь есть много ответов.
Просто добавь:
RewriteEngine On
RewriteCond% {SERVER_PORT} 80
RewriteRule ^ (. *) $ https://domain.com/ $ 1 [R, L]
до конца того, что у вас есть в вашем .httaccess, и вот что.
Тем не менее мы не настолько безопасны, насколько возможно, с этими двумя инструментами.
Остальное просто. Если отсутствуют атрибуты, то есть …
if (empty ($ _ SERVER ["HTTPS"])) {// ЧТО-ТО – FISHY
}if (strstr ($ _ SERVER ['HTTP_HOST'], "mywebsite.com") === FALSE) {// Что-то есть FISHY
}
Также скажите, что вы обновили файл httaccess, и вы проверяете:
if ($ _ SERVER ["HTTPS"]! == "on") {// Что-то подозрительное
}
Есть намного больше переменных, которые вы можете проверить, то есть ..
HOST_URI (если для проверки есть статические атрибуты)
HTTP_USER_AGENT (одинаковые разные значения сеанса)
Таким образом, все, что я говорю, просто не соглашаются на тот или иной, когда ответ лежит в сочетании.
Для получения дополнительной информации о перезаписи httaccess см. Docs-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html.
Здесь несколько стеков -> Force SSL / https с использованием .htaccess и mod_rewrite
а также
Получение полного URL-адреса текущей страницы (PHP)
Чтобы назвать пару.
Используйте $_SERVER['HTTPS']
чтобы определить, является ли он SSL , и перенаправлять в нужное место, если нет.
И помните, что страница, которая отображает форму, не нуждается в подаче через HTTPS, это URL-адрес обратной связи, который больше всего в ней нуждается.
Изменить : да, как указано ниже, лучше всего использовать весь процесс в HTTPS. Это гораздо более обнадеживающе – я указывал, что пост является самой важной частью. Кроме того, вам необходимо позаботиться о том, чтобы все файлы cookie были настроены на безопасность, поэтому они будут отправляться только через SSL. Решение mod_rewrite также очень изящно, я использовал его для защиты множества приложений на своем собственном веб-сайте.
Не смешивайте HTTP и HTTPS на одной странице. Если у вас есть страница формы, которая подается через HTTP, я буду нервничать из-за отправки данных – я не вижу, передает ли передача HTTPS или HTTP, не используя View Source и не охотясь за ней.
Работа над формой через HTTPS вместе с ссылкой отправки не настолько тяжелая, чтобы изменить преимущество.
Использование этого НЕ ДОЛЖНО:
if($_SERVER["HTTPS"] != "on") { header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]); exit(); }
Если у вас есть HTTP-контент (например, внешний источник http-изображения), браузер обнаружит возможную угрозу. Поэтому убедитесь, что все ваши ссылки ref и src внутри вашего кода: https
Для тех, кто использует 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>
использовать 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]
Вы не должны по соображениям безопасности. Особенно, если в игре играют куки. Это дает вам широкие возможности для атаки на основе файлов cookie.
В любом случае, вы должны использовать правила управления Apache для его настройки.
Затем вы можете проверить, включен ли HTTPS и перенаправлять по мере необходимости, когда это необходимо.
Вы должны перенаправить на страницу оплаты только с помощью ФОРМОВОЙ ПОЧТЫ (без получения), а доступ к странице без POST должен быть направлен обратно на другие страницы. (Это поймает людей просто горячими прыжками).
http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/
Хорошее место для начала, извинения за то, что вы не предоставляете больше. Но вы действительно должны засунуть все через SSL.
Это чрезмерно защитное, но по крайней мере у вас меньше беспокойства.
Если вы используете 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 для всех правил перезаписи, поэтому, если у вас уже есть это, просто скопируйте вторую и третью строки.
Надеюсь, это поможет.
Я прошел через множество решений с проверкой статуса $ _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'], а другие нет
Я использовал этот скрипт и хорошо работает через сайт.
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(); }
<?php // Require https if ($_SERVER['HTTPS'] != "on") { $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; header("Location: $url"); exit; } ?>
Это просто.