Перенаправляет 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 в среде общего хостинга. В обычной установке Cakephp есть три файла.htaccess.
<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/$1 [R,L]
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [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}/$1 [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. ******** Добавить в функцию инициализации *********
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();
В Controller/AppController.php
Этот код работает для моего CakePHP 3.8
use Cake\Routing\Router;
а также
public function initialize()
{
parent::initialize();
if(env('REQUEST_SCHEME')=='http')
{
return $this->redirect('https://www.' . env('SERVER_NAME') . Router::url($this->request->getRequestTarget()));
}else{
$split=explode('.',env('SERVER_NAME'));
if($split[0]!='www'){
return $this->redirect('https://www.' . env('SERVER_NAME') . Router::url($this->request->getRequestTarget()));
}
}
}
Если вы видите #SERVER-HTTPS-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/$1 [R=301,L]
больше информации здесь