Заставить 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 моя локальная машина, на которой я изменил файл hosts в 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, я не хочу, чтобы остальная часть сайта была.

15

Решение

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

Другие решения

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

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

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

4

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

3

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

2
По вопросам рекламы [email protected]