cakephp 和 https 重定向

问题描述 投票:0回答:7

我有一个网站,对 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)

我还将这两行添加到 .htaccess 文件中(来自另一篇文章),并删除了上面的代码,但随后出现“重定向循环”错误

RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
cakephp ssl https cakephp-2.0 litespeed
7个回答
22
投票
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 这对我有用。


9
投票

我的 .htaccess 文件中有这个,效果很好。我让它忽略本地和暂存 URL,就像我有 http://local.example.com 它不会强制重定向该 URL。这些线可以删除。我喜欢使用 .htaccess 方法而不是 AppController 中的方法。这也是共享托管环境上标准 CakePHP 安装中的顶级 .htaccess 文件。正常的 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 已安装并且正常工作。


5
投票

所以我找不到一种好方法来强制我的整个网站使用 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 控制器中...这将保护整个站点。

希望这可以帮助其他也在苦苦挣扎的人。


4
投票

最后一个方法适用于 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();

2
投票

在控制器/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()));
            }
        }
}




1
投票

如果您看到#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]

更多信息这里


0
投票

对于 CakePHP 5.x(自 4.x 起),您可以使用 HttpsEnforcerMiddleware

© www.soinside.com 2019 - 2024. All rights reserved.