我的网站对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]
答案 0 :(得分:16)
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
答案 1 :(得分:8)
我在.htaccess文件中有这个功能,效果很好。我忽略了本地和暂存网址,就像我有http://local.example.com它不会强制重定向该网址。这些行可以删除。我喜欢使用.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已安装并正常工作。
答案 2 :(得分:5)
所以我找不到一种强制方法来强制我的整个网站加入https而不会出现重定向循环和错误。如果您修改该页面的单个控制器,这将在页面级别上工作)。无论如何,这是我在弄乱了几天之后最终做的事情。
在AppController.php中的controllers控制器文件夹中,我将以下代码直接放在:
下public function 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控制器中...这将保护整个站点。
希望这可以帮助那些也在苦苦挣扎的人。
答案 3 :(得分:4)
最后一个方法是CakePHP2。 CakePHP3稍后更新了以下内容:
在AppController.php中的controllers控制器文件夹中,执行以下操作:
1. ********添加初始化功能*********
dice.cpp: In function ‘int main()’:
dice.cpp:15: error: ‘diel’ was not declared in this scope
dice.cpp:15: error: expected primary-expression before ‘int’
dice.cpp:15: error: expected `;' before ‘int’
************添加新的公共功能**********
public function initialize()
{
parent::initialize();
/* ADD THIS NEW LINE */
$this->loadComponent('Security', ['blackHoleCallback' => 'forceSSL']); // SSL SECURITY
3。****在beforeFilter函数******
中添加它public function forceSSL()
{
return $this->redirect('https://' . env('SERVER_NAME') . $this->request->here);
}
答案 4 :(得分:1)
如果您看到#SERVER-HTTPS-ON#(打开),请添加
Ruby
如果您看到#SERVER-HTTPS-ON#(1),请添加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
如果您看到#SERVERPORT443#,请添加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=1
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
如果您看到#LOADBALANCER#,请添加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
如果您看到#CDN#,请添加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
如果您看到#Cloudflare#,请添加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
如果您看到#ENVHTTPS#,请添加
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:CF-Visitor} ‘”scheme”:”http”‘
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
在ssl测试页面的底部,您将看到HTTP HOST。这应该与您的域名相同。如果没有,您可能需要对域进行硬编码以防止重定向问题,例如:
<IfModule mod_rewrite.c>
RewriteEngine on RewriteCond %{ENV:HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
更多信息here
答案 5 :(得分:1)
在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()));
}
}
}