强制Canonical使用HTTPS

时间:2016-01-29 11:05:04

标签: 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('scheme' => 'https', 'force_canonical' => true,)); ?>">Register</a>

我得到了什么:http://myproject.dev/customer/registration

我想要的是什么:https://myproject.dev/customer/registration

它似乎正在使用当前的方案 - 所以如果我在http上,那么网址是http,如果我在https上,那么网址是https。

如何强制$this->url始终使用https方案?

'router' => array(
  'routes' => array(
    'customer' => array(
      'type' => 'Zend\Mvc\Router\Http\Literal',
      'options' => array(
        'route' => '/customer',
        'scheme' => 'https',
        'defaults' => array(
          '__NAMESPACE__' => 'Customer\Controller',
          'https' => true,
          'controller' => 'Index',
          'action' => 'index',
        ),
      ),
      'child_routes' => array(
        'default' => array(
          'type' => 'Segment',
          'options' => array(
            'route' => '/[:controller[/:action]]',
            'scheme' => 'https',
            'constraints' => array(
              'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
              'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
            ),
            'defaults' => array(
            ),
          ),
        ),
      ),
    ),
  ),
),

[编辑]

myproject.dev是我的本地计算机,我已将主机更改为vhosts文件。我已经设置了我的vhosts文件来接受ssl,这不是问题。

我已将路由类型更改为Zend\Mvc\Router\Http\Scheme并添加了scheme选项,但会生成以下网址:https://myproject.dev:80/registration,当它尝试连接到端口80时生成SSL connection error

当我将child_routes type更改为scheme时,生成的网址为:https://myproject.dev:80/customer

[编辑]

作为一种临时解决方案,如果用户尝试访问非安全方案的客户部分,我正在进行htaccess重定向:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/customer/?.*$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

我不喜欢这种方法,因为它不应该是必要的!

[编辑]

虽然我希望我的客户部分是https,但我不希望网站的其余部分出现。

4 个答案:

答案 0 :(得分:5)

  

使用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);
        }

答案 1 :(得分:4)

您能否在.htaccess文件中添加这2行。

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

它将在https协议上运行。

答案 2 :(得分:3)

我相信,这种自动重定向应该在HTTP-daemon级别上为所有以/ customer开头的URL完成。所有流行的HTTP服务器,如Apache,Nginx或Lighttpd都允许这样的配置。 imo。

打扰网络安全的业务逻辑并不好

答案 3 :(得分:2)

使用ServerUrl和URL视图助手的组合来构建您的URL,EG:

<?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,而不会导致指定错误的端口出现问题。