перенаправление CakePHP и https
у меня есть сайт, который имеет некоторые строгие требования для целей SEO.
основной из них перенаправляет все http-запросы на https, которые я сделал, добавив это в AppController:
public function forceSSL() {
    return $this->redirect('https://' . env('SERVER_NAME') . $this->here);
}
public function beforeFilter() {
    $this->Security->blackHoleCallback = 'forceSSL';
    $this->Security->requireSecure();
}
проблема у меня с 404 страницами, они не перенаправляются на https (например. www.hublink.net/asdfg)
Я также добавил Эти 2 строки в.htaccess файл (из другого поста), и удалил вышеуказанный код, но затем получить " цикл перенаправления" ошибка
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
5 ответов
У меня есть это в моем .htaccess файл и он отлично работает. Я игнорирую локальные и промежуточные URL-адреса, например, если бы у меня былhttp://local.example.com он не будет принудительно перенаправлять для этого url. Эти линии можно удалить. Мне нравится использовать .htaccess подход по сравнению с одним в AppController. Это тоже верхний уровень .файл htaccess в стандартной установке CakePHP в среде общего хостинга. Их три .файлы htaccess в обычной установке Cakephp.
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    # FORCE SSL REDIRECTION
    RewriteCond %{ENV:HTTPS} !on [NC]
    RewriteCond %{HTTP_HOST} !^local [NC]
    RewriteCond %{HTTP_HOST} !^staging [NC]
    RewriteRule ^(.*)$ https://www.example.com/ [R,L]
    RewriteRule ^$ app/webroot/ [L]
    RewriteRule (.*) app/webroot/ [L]
</IfModule>
Проверьте среду хостинга и убедитесь, что вам разрешено иметь .htaccess файлы. Необходимо убедиться, что ModRewrite установлен и работает.
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/ [R=301,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
см.https://wiki.apache.org/httpd/RewriteHTTPToHTTPS У меня получилось.
поэтому я не мог найти хороший способ заставить весь мой сайт https без получения циклов перенаправления и ошибок. Это будет работать и на уровне страницы, если вы измените отдельный контроллер для этой страницы). во всяком случае, это то, что я, наконец, сделал после возни с этим в течение нескольких дней.
внутри папки "Мои контроллеры" в AppController.php я разместил следующий код непосредственно под:
публичная функция beforeFilter() {
=================================
 // Force to SSL
 $this->request->addDetector('ssl', array(
    'env' => 'HTTP_X_FORWARDED_PROTO',
    'value' => 'https'
));
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == "http") {  return $this->redirect('https://' . env('SERVER_NAME') . $this->here); }
Итак, что это делает, это сначала проверить, является ли это http или https. Если это http,то я перенаправляю страницу на версию https. Поместив его в AppController.контроллер на PHP ... это обеспечит безопасность всего сайта.
надеюсь, это поможет кому-то еще, кто также борется.
последний метод был для CakePHP2. Для CakePHP3 немного обновлено следующее:
внутри папки "Мои контроллеры" в AppController.php сделайте следующее:
1.******** Добавить В Функцию Initialize*********
public function initialize()
{
    parent::initialize();
    /* ADD THIS NEW LINE */
    $this->loadComponent('Security', ['blackHoleCallback' => 'forceSSL']); // SSL SECURITY
- 
************ Добавление Новой Публичной Функции ********** 
 public function forceSSL() { return $this->redirect('https://' . env('SERVER_NAME') . $this->request->here); }
3.**** Добавьте это в функцию beforeFilter******
public function beforeFilter(Event $event)
{
    /* ADD 2 NEW LINES */
    parent::beforeFilter($event); 
    $this->Security->requireSecure();
если вы видите #SERVER-HTTPS-ON# (on), добавьте
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
если вы видите #SERVER-HTTPS-ON# (1), добавьте
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=1
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
если вы видите #SERVERPORT443#, добавьте
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
если вы видите #LOADBALANCER#, добавьте
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
если вы видите #CDN#, добавьте
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
если вы видите #Cloudflare#, добавьте
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:CF-Visitor} ‘”scheme”:”http”‘
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
если вы видите #ENVHTTPS#, добавьте
<IfModule mod_rewrite.c>
RewriteEngine on   RewriteCond %{ENV:HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
в нижней части тестовой страницы ssl вы увидите HTTP HOST. Это должно быть так же, как и ваш домен. Если нет, вам может потребоваться жесткий код вашего домена, чтобы предотвратить проблемы перенаправления, например:
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ full_url_with_https/ [R=301,L]
подробнее здесь
