перенаправить на сайт CakePHP китафп маршруты к http не https - PullRequest
1 голос
/ 17 декабря 2010

Я разработал сайт CakePHP, который должен использовать ssl для всех страниц.Он работает, как и ожидалось, за исключением случаев, когда я использую перенаправление в контроллере, он перенаправляет на http: //subdomain.domain.com, а не https: //subdomain.domain.com/controller/action.

Я решил это с помощьюсоздание виртуального хоста для порта 80, указывающего на приложение cakephp, и добавление этих правил перезаписи в .htaccess

RewriteCond% {HTTPS} off RewriteRule (. *) https://%{HTTP_HOST}%{REQUEST_URI} [L]

Это ловит эту ситуацию и перенаправляет на https, но это дает ненужный дополнительный трафик на сервер.

Причиной такого дополнительного трафика является функция перенаправления, так как она генерирует неправильные URL-адреса.Я посмотрел на функцию перенаправления, и она вызывает router :: url для создания фактического URL.Однако я не могу понять, как и где настроить маршрутизатор для использования https, а не http.

Tim

Ответы [ 3 ]

5 голосов
/ 17 декабря 2010

Я немного догадываюсь, но я подозреваю, что это тот самый RewriteRule, который все портит.

Вы должны "перенаправлять", а не "переписывать".Сгенерированные ссылки Cake обычно относятся к корню, поэтому не указывайте протокол, пока вы не передадите «true» в качестве второго параметра.

У меня также есть apache, прослушивающий как 80, так и 443, так что я могу по крайней мереотвечать на неправильные запросы.

Это код, который я имею в своем классе AppController, чтобы сделать то же самое:

function beforeFilter() {
    parent::beforeFilter();
    $this->_setupSecurity();
}

function _setupSecurity() {
    $this->Security->blackHoleCallback = '_badRequest';
    if(Configure::read('forceSSL')) {
        $this->Security->requireSecure('*');
    }
}

/**
* The main SecurityComponent callback.
* Handles both missing SSL problems and general bad requests.
*/

function _badRequest() {
    if(Configure::read('forceSSL') && !$this->RequestHandler->isSSL()) {
        $this->_forceSSL();
    } else {
        $this->cakeError('error400');
    }
    exit;
}

/**
* Redirect to the same page, but with the https protocol and exit.
*/

function _forceSSL() {
    $this->redirect('https://' . env('SERVER_NAME') . $this->here);
    exit;
}

У меня также есть свой собственный параметр конфигурации 'forceSSL' в bootstrap.phpдля включения и выключения в зависимости от среды, поэтому для работы вышеуказанного необходимо установить значение true.

0 голосов
/ 19 ноября 2014

Его пример уже упоминается в CookBook http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#usage

class AppController extends Controller {
    // Add security component
    public $components = array('Security');

    public function beforeFilter() {
        $this->Security->blackHoleCallback = 'forceSSL';
        $this->Security->requireSecure();
    }

    // Add this function in your AppController
    public function forceSSL() {
        return $this->redirect('https://' . env('SERVER_NAME') . $this->here);
    }
}
0 голосов
/ 19 декабря 2010

Я обнаружил ошибку, что это неверная конфигурация Apache.

При попытке решения Jamies сайт оказался в цикле перенаправления, поскольку RequestHandler-> isSSL () возвратил false, даже если запрос был https.Затем я обнаружил, что $ _SERVER ['https'] не был установлен, а $ _SERVER ['port'] равнялся 80, а не 443, как ожидалось.

В этот момент я разместил свои директивы ssl в sites-available / default,

SSLEngine on
SSLCertificateFile [path to cert file]
SSLCertificateKeyFile [path to keyfile]

Перемещение директив ssl в виртуальныйхост для субдомена решил проблему с помощью циклов перенаправления.

На самом деле также решена моя первоначальная проблема, потому что метод Router :: url проверяет $ _SERVER ['https'], если установлен, генерирует URL, который начинается сhttps: в противном случае просто http:

Я протестировал и решение Jameies, и свое собственное с правилами перезаписи в .htaccess, и они оба работают как положено после исправления.

Тим

...