Php 强制Canonical使用HTTPS

Php 强制Canonical使用HTTPS,php,zend-framework,zend-framework2,view-helpers,zend-view,Php,Zend Framework,Zend Framework2,View Helpers,Zend View,我希望我的客户部分是https,例如注册、登录、个人详细信息、订单详细信息等。我已将我的路线设置为包含https方案(我可以通过https访问客户部分),但我不能强制我的链接使用https: <a class="register" href="<?php echo $this->url('customer/default', array('controller' => 'registration', 'action' => 'index'), array('sche

我希望我的客户部分是https,例如注册、登录、个人详细信息、订单详细信息等。我已将我的路线设置为包含https方案(我可以通过https访问客户部分),但我不能强制我的链接使用https:

<a class="register" href="<?php echo $this->url('customer/default', array('controller' => 'registration', 'action' => 'index'), array('scheme' => 'https', 'force_canonical' => true,)); ?>">Register</a>
[编辑]
myproject.dev
是我的本地计算机,在这里我将主机更改为vhosts文件。我已经将vhosts文件设置为接受ssl,这不是问题所在

我已将路由类型更改为
Zend\Mvc\Router\Http\Scheme
,并添加了Scheme选项,但该选项会生成以下url:
https://myproject.dev:80/registration
当它试图连接到端口80时,会生成一个
SSL连接错误

当我将
子路由
类型
更改为
方案
时,生成的url为:
https://myproject.dev:80/customer

[编辑] 作为权宜之计,如果用户试图通过非安全方案访问客户部分,我将执行htaccess重定向:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/customer/?.*$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
我不喜欢这种方法,因为它不应该是必要的

[编辑]
虽然我希望我的客户部分是https,但我不希望站点的其余部分是https。

使用ServerUrl和URL视图帮助程序的组合来构建URL,例如:

<?php
$this->getHelper('ServerUrl')->setScheme('https')
?>
<a href="<?php echo $this->serverUrl($this->url('customer/default', array('controller' => 'registration', 'action' => 'index'), array('force_canonical' => true,))); ?>">Link Caption</a>


这将强制链接是完全限定的,而不是相对的,并将强制方案为https,而不会导致端口指定错误的问题。

我认为,对于所有以/customer开头的URL,应该在HTTP守护程序级别上执行这种自动重定向。所有流行的HTTP服务器,如Apache、Nginx或Lighttpd都允许这样的配置。在我看来,在网络安全方面打扰业务逻辑是不好的。

请在.htaccess文件中添加这两行

<IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{HTTP_HOST} !^myproject\.
      RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

重新启动发动机
重写cond%{HTTP_HOST}^我的项目\。
重写规则^(.*)$https://www.%{HTTP_HOST}/$1[R=301,L]
它将在https协议上运行

使用Zend\Uri\UriFactory

在您的操作顶部添加以下代码,或者在插件中创建一个方法

$uri = $this->getRequest()->getUri();
        $uri = (string) $uri;
        $url = UriFactory::factory($uri);
        $http = 'http';
        $http_current = $url->getScheme();
        if($http == $http_current){
            $url->setScheme('https');
            return $this->redirect()->toUrl($url);
        }

我不想在https上运行整个网站,只想运行客户部分。目前,我正在执行类似于上述的重写规则,但仍然认为这应该在应用程序逻辑中处理。我已经尝试过了,并且得到了一个异常,帮助程序无法加载ServerUrl。我需要将其作为依赖项包含吗?作为一个视图助手,我不认为我需要……您有两个选择:1)使用Apache重定向,或2)使用PHP重定向。但我首先要问的是,为什么你只想要你网站的一部分。只需确保整个网站的安全,对您的用户来说就更友好了。
$uri = $this->getRequest()->getUri();
        $uri = (string) $uri;
        $url = UriFactory::factory($uri);
        $http = 'http';
        $http_current = $url->getScheme();
        if($http == $http_current){
            $url->setScheme('https');
            return $this->redirect()->toUrl($url);
        }