web-dev-qa-db-ja.com

cakephpとhttpsリダイレクト

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]
11
djcamo

これは.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がインストールされ、機能していることを確認する必要があります。

9
darensipes
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 を参照してください。

18
Janckos

そのため、リダイレクトループとエラーが発生せずに、サイト全体を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コントローラーに配置することで...これによりサイト全体が保護されます。

これがまた苦労している他の誰かを助けることを願っています。

5
ChrisO

最後の方法はCakePHP2用でした。以下は、CakePHP3用にわずかに更新されています。

AppController.phpのコントローラーフォルダー内で、次の手順を実行します。

1。********初期化関数を追加します*********


public function initialize()
{
    parent::initialize();

    /* ADD THIS NEW LINE */
    $this->loadComponent('Security', ['blackHoleCallback' => 'forceSSL']); // SSL SECURITY
  1. ************新しいパブリック関数を追加します**********


    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();
4
Chris O

#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]

詳細 ここ

1
Kamal Kumar

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()));
            }
        }
}



1
Ritesh Paryali