Я хочу определить , просматривает ли пользователь безопасную страницу и перенаправляет, если нет (для входа в систему).
Тем не менее, мой сайт перемещается через прокси-сервер, прежде чем я вижу, что переменные сервера и прокси-сервер (прямо сейчас) говорят мне, что $_SERVER['HTTPS']
когда URI явно указывает на другое. Он также показывает 'on'
когда пользователь безопасно перемещается.
Перемещение по http://
и https://
оба выводят, что $_SERVER['SERVER_PORT']
= 443
.
У меня нет возможности внести изменения в прокси-сервер, поэтому я хочу знать:
Я задал этот вопрос для идей, но они в основном вращаются вокруг переменной $_SERVER['HTTPS']
, заслуживающей доверия. Ба!
Похоже, что этот вопрос испытывает хотя бы что-то подобное, но он / она смог его решить, адаптировав решение apache.
Существуют ли какие-либо другие переменные или трюки PHP SERVER для обнаружения того, с чего начинается URI пользователя? Единственная разница между переменными $ _SERVER при просмотре моего сайта http против https:
Являются ли какие-либо из этих предметов достаточно сильными, чтобы надеть свой вес без его расщепления и причинения боли позже? Возможно, я не должен доверять чему-либо, фильтруемому через прокси-сервер, поскольку он может меняться в любой момент времени.
Вот мой план использования JavaScript для этой цели; это лучшее, что у меня есть?
function confirmSSL() { if(location.protocol != "https:") { var locale = location.href; locale = locale.replace(/http:\/\//,"https://"); location.replace(locale); } } <body onLoad="confirmSSL()">...
Я думаю, что если пользователь отключил JavaScript в моем сообществе, то они, надеюсь, знают, что они делают. Они должны иметь возможность вручную попасть в безопасную зону. Какие предложения <noscript>
будут обычным явлением / хорошей практикой? Что-то вроде этого, возможно?
<noscript>
Перейдите с помощью https: //blah.more.egg/fake, чтобы защитить вашу информацию.</noscript>
PHP-решения, которые работают (с хорошим объяснением), будут отдавать предпочтение правильному ответу. Не стесняйтесь представить лучшую реализацию JavaScript или ссылку на нее.
Большое спасибо!
Хотя это уже частично обсуждается в комментариях к вопросу, я подведу некоторые предложения относительно логики перенаправления в JavaScript:
window.location
вместо location
целесообразно, объяснение можно найти здесь . Я предлагаю использовать следующий код (принятый отсюда ), который является коротким и эффективным:
<head> <script type="text/javascript"> if (window.location.protocol != "https:") { window.location.href = "https:" + window.location.href.substring(window.location.protocol.length); } </script> ... </head> <body> ... <noscript>Please click <a href="https://my-cool-secure-site.com">here</a> to use a secure connection!</noscript> ...
Просто используйте подход на стороне клиента. Если ваш прокси-сервер не настраивается, этот параметр отсутствует. Обнаружение и перенаправление через js в порядке.
Существует также способ добиться перенаправления без javascript на стороне клиента. Этот метод может быть особенно полезен, если JavaScript отключен в браузере клиента.
Шаги – это чистый PHP и довольно простой:
https
Пример кода:
<?php session_start(); if( !isset($_SESSION['runningOnHttps']) ) { $_SESSION['runningOnHttps'] = true; header('Location: https://my-cool-secure-site.com'); } ?>
Естественно, вы можете ограничить эту функциональность теми браузерами с отключенным JavaScript, чтобы создать своего рода «гибридный режим»: всякий раз, когда есть новый сеанс с не-JS-браузером, сделайте запрос на какой-то сценарий обратного вызова, который уведомляет сервер для отправки заголовка местоположения:
some_landingpage.php отправляет начальный <noscript>
содержащий скрытый iframe, который будет загружать redirect.php:
if( !isset($_SESSION['checkWasMade']) ) { $_SESSION['checkWasMade'] = true; echo '<noscript> <iframe src="redirect.php" style="visibility: hidden; position: absolute; left: -9000px;"></iframe> </noscript>'; }
Запрос на redirect.php даст вам знать, что JavaScript отключен и дает вам возможность принудительно перенаправлять, отправив заголовок Location
(см. Выше) со следующим фактическим запросом.
Разумеется, этот метод будет работать только надежно, если протокол не изменится (магически?) В течение одного сеанса.
ОБНОВИТЬ:
Весь вышеупомянутый метод обработки пользовательских агентов, не относящихся к JavaScript, может быть рассмотрен с помощью еще более аккуратного подхода:
Я только что узнал, что <noscript>
также может быть включен внутри <head>
, что позволяет просто перенаправлять через теги <meta>
.
Следовательно, some_landingpage.php может отправить начальное метаобновление внутри <noscript>
:
// The following echo must appear inside the html head if( !isset($_SESSION['checkWasMade']) ) { $_SESSION['checkWasMade'] = true; echo '<noscript> <meta HTTP-EQUIV="REFRESH" content="0; url=https://my-cool-secure-site.com"> </noscript>'; }