2012-01-17 2 views
1

Я написал сценарий для принудительного доступа к определенным разделам сайта через http или https. Мы хотим, чтобы пользователь перенаправлялся на обычную страницу http, если они случайно попали в версию https, и наоборот. Пока, так хорошо, но у меня есть 2 вопроса для вас, ребята.Принуждение http/https: как определить https и какой заголовок статуса отправлять при перенаправлении?

  1. Каков правильный заголовок состояния для отправки при переключении протокола? В настоящее время я использую это в обоих случаях перед перенаправлением:

    header('HTTP/1.1 301 Moved Permanently'); 
    
  2. Что является предпочтительным способом обнаружить, если мы используем протокол HTTPS?

    // if ($_SERVER['SERVER_PORT'] == 443) /* EDIT: OK, not this? */ 
    
    if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on')) 
    

    Что-то еще? И то и другое?

Ответы на комментарии:

  • Мы используем Apache, но если есть универсальное решение, которое было бы здорово.

  • Мы не хотим использовать .htaccess, потому что требуемые страницы https «помечены» как таковые используемой нами CMS и что это часть. Мы не хотим «жестко закодировать» URL-адреса в файле.

+0

IIRC, '$ _SERVER ['HTTPS']' присутствует только на некоторых серверах (а именно Apache). – ceejayoz

+2

Проверка порта ненадежна. Можно запускать SSL на другом, отличном от 443, а также можно подключиться к порту 443 * без * с помощью HTTPS (хотя сервер обычно будет убивать запрос с ошибкой). – animuson

+0

Почему я не чувствую запах htaccess здесь? –

ответ

2
  1. 301 перенаправлением является надлежащим способом. Вы не можете переключаться между средним потоком HTTP и HTTPS. Страница должна быть перезагружена в клиенте.
  2. Второй метод, используя $_SERVER['HTTPS'], является предпочтительным методом. Просто убедитесь, что ваш веб-сервер поддерживает его.
+0

Что значит «нужно перезагрузить в браузере»? Мы перенаправляем с помощью 'header ('Location: ...')'. Я просто видел здесь http://stackoverflow.com/questions/452375/detecting-https-requests-in-php, что с Apache могут быть альтернативные методы, а именно '$ _SERVER ['HTTP_HTTPS']'. Должен ли я проверить оба варианта? Должен ли я полностью игнорировать значение '$ _SERVER ['SERVER_PORT']'? Насколько я понимаю, это ненадежно, но означает ли это, что это бесполезно? –

+0

Ну, если не браузер, то, по крайней мере, клиент. Запрос должен быть сделан клиентом с использованием соответствующего протокола (HTTPS vs HTTP). Это перенаправление 301 перенаправляет. Вы ничего не можете отправить клиенту, чтобы он переключился по тому же запросу. Да, некоторые версии сервера Apache имеют HTTP_HTTPS. Просто проверьте документы для своей версии. –

+0

Да, это новый запрос, все данные '$ _POST' и что-то не будет потеряно. Это ты имел в виду? Я думаю, нет никакого вреда в проверке как «HTTP_HTTPS», так и «HTTPS», чтобы увидеть, включен ли какой-либо один из них, правильно? –

 Смежные вопросы

  • Нет связанных вопросов^_^