SEOの目的でいくつかの厳しい要件があるサイトがあります。
主なものは、これをAppControllerに追加することによって行ったすべてのhttpリクエストをhttpsにリダイレクトすることです。
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]
これは.htaccessファイルにあり、うまく機能します。 http://local.example.com のように、ローカルURLとステージングURLを無視して、そのURLのリダイレクトを強制しません。それらの行は削除できます。 AppControllerのアプローチよりも.htaccessアプローチを使用するのが好きです。これは、共有ホスティング環境での標準のCakePHPインストールの最上位の.htaccessファイルでもあります。通常のCakephpインストールには3つの.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に強制する良い方法を見つけることができませんでした。これは、そのページの個々のコントローラーを変更した場合、ページレベルでも機能します)。とにかく、これは私が数日間これをいじった後にようやくやったことです。
AppController.phpのcontrollersフォルダー内に、次のコードを直接配置しました。
パブリック関数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();
#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ホストが表示されます。これはドメインと同じである必要があります。そうでない場合は、次のようなリダイレクトの問題を防ぐためにドメインをハードコーディングする必要があります。
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ full_url_with_https/$1 [R=301,L]
詳細 ここ
controller /AppController.phpで
このコードは私のCakePHP3.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()));
}
}
}