Сила Canonical для использования HTTPS

Я хочу, чтобы моя часть клиента была 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, то URL-адрес будет http, если я на https, то URL-адрес 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 и добавил параметр схемы, но генерирует следующий URL: https://myproject.dev:80/registration, который генерирует SSL connection error при попытке подключения к порту 80!

Когда я изменяю child_routes type на scheme, созданный url: https://myproject.dev:80/customer

[править]

Как решение стоп-зазора, я делаю перенаправление htaccess, если пользователь пытается получить доступ к разделу клиента на небезопасной схеме:

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

Мне не нравится этот подход, поскольку он не должен быть необходимым!

[править]

Пока я хочу, чтобы раздел моего клиента был https, я не хочу, чтобы остальная часть сайта была.

Ответы

Ответ 1

Можете ли вы добавить эти 2 строки в ваш файл .htaccess.

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

Он будет работать по протоколу https.

Ответ 2

использовать 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);
        }

Ответ 3

Я считаю, что такое автоматическое перенаправление должно выполняться на уровне HTTP-демона для всех URL-адресов, начинающихся с /customer. все популярные HTTP-серверы, такие как Apache, Nginx или Lighttpd, допускают такие конфигурации. это не хорошо беспокоить бизнес-логику о безопасности сети, imo.

Ответ 4

Используйте комбинацию помощников 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, не вызывая проблем с неправильным указанием порта.