Принуждение конкретной страницы для использования HTTPS с угловыми
В нашем приложении у нас есть страница оплаты, на которую мы хотим использовать SSL, потому что мы обрабатываем информацию о кредитной карте. Мы уже внедрили правила перезаписи для apache, чтобы перенаправить запрос на конкретную страницу на HTTPS, - который заботится о любых прямых запросах к странице платежа (http://oursite.com/pay).
Однако большинство навигации на нашем сайте выполняется с помощью относительных URL-адресов и states
с помощью ui-router
в angularjs, и мы обнаружили, что apache не улавливает эти запросы и поэтому служит страница без SSL.
EX Если пользователь нажимает ссылку с ui-sref='pay'
ui-router
, загружает шаблон и обновляет состояние - ни в коем случае не является запросом, сделанным сервером для нового uri, поэтому apache не может перенаправить на https
Есть ли способ заставить ui-router (или angular в целом) заставить государство использовать HTTPS без необходимости менять все ссылки для перезагрузки всего сайта?
Конечно, это также может быть недостатком в наших правилах перезаписи... Вот что мы до сих пор
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} /pay
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^ index.html [L]
Второй набор правил - принудительное применение html5mode для нашего приложения.
RewriteCond %{REQUEST_FILENAME} !-f
на месте, чтобы angular мог получить шаблон оплаты для состояния без необходимости использования SSL. Это нормально?
Ответы
Ответ 1
У меня была аналогичная проблема, хотя я использовал $routeProvider в приложении SPA. Я сделал, чтобы обеспечить перенаправление внутри контроллера:
var forceSSL = function () {
if ($location.protocol() !== 'https') {
$window.location.href = $location.absUrl().replace('http', 'https');
}
};
forceSSL();
Это, однако, перезагружает все ресурсы. Однако это происходит только один раз при переключении в режим SSL.
Обратите внимание, что функция фактически находится в службе, поэтому ее можно вызывать из любого места.
Надеюсь, это поможет.