CakePHP Force SSL - env ​​('HTTPS') всегда нулевой - PullRequest
1 голос
/ 06 января 2012

Я пробовал довольно много разных решений ( здесь , здесь , здесь , здесь ), но почти все из нихвызвал либо 404, либо бесконечно циклы.

Наконец я нашел этот вопрос , который, кажется, ближе всего подходит к работе;но это также вызывает ошибку в Firefox, когда я пытаюсь загрузить одно из действий, для которых я хочу требовать SSL:

Страница не перенаправляет должным образом

Firefox обнаружил, чтосервер перенаправляет запрос на этот адрес способом, который никогда не будет завершен.

Эта проблема иногда может быть вызвана отключением или отказом в приеме файлов cookie.

Наконец через группуотладки я обнаружил, что env('HTTPS') всегда возвращает null по некоторым причинам (как и $this->RequestHandler->isSsl(); и $_SERVER['HTTPS']), даже когда я использую соединение HTTPS.Я не могу понять, почему это происходит, так как мой браузер сообщает, что я защищен SSL, и мой сертификат, кажется, установлен правильно.

Подробнее

Сервер nginx

listen 80;
listen 443 ssl;

ssl_certificate     /etc/ssl/certs/domain.chain.crt;
ssl_certificate_key /etc/ssl/private/domain.key;
...

App Controller

var $secureItems = array('login', 'edit', 'viewDocs');

function beforeFilter() {
    $this->Auth->allow('index', 'display');
    $this->set('loggedUser', $this->Auth->user());

    $this->__checkSSL();
}

__checkSSL() и вспомогательные функции непосредственно из предыдущего вопроса о ссылке ( этот ).

Страницы загружаются нормально в HTTP и HTTPS, если это не одно из действий, перечисленных в $secureItems, и как только я перехожу к одному из этих действий (HTTP или HTTPS), оно бесконечно перенаправляет.

Любая помощь приветствуется!

Редактировать :

Я почти уверен, что проблема в бесконечном цикле, вызванном env('HTTPS'), всегда равным нулю.Так как оно имеет нулевое значение, условие проверки всегда ложно и делает его перенаправленным на URL-адрес HTTPS, даже если он уже на нем.

Есть ли другой способ проверить HTTPS или кто-то может сказать мне, почему env('HTTPS') всегдавозвращает ноль?

1 Ответ

2 голосов
/ 09 января 2012

Вы редактируете - это шаг в правильном направлении ...

Веб-сервер должен устанавливать переменные окружения, такие как $_SERVER['HTTPS'].

Если это имеетне имеет значения, вам нужно смотреть не дальше, чем на веб-сервер - nginx в вашем случае - или на любые промежуточные веб-серверы (обратные прокси-серверы и т. д.), но из того, что я могу собрать, вы должны убедиться, что nginx отправляет fastcgi_param HTTPS on для соединений через порт 443.

Добавление чего-то подобного, возможно:

server {
    listen 443;
    server_name example.com;

    ssl on;
    fastcgi_param HTTPS on;

    # ...
}

Поиск "nginx fastcgi_param HTTPS" для других примеров конфигурации.

Я также нашел некоторые другие переменные , которые могут быть полезны в дальнейшем.

...