强制特定页面使用带有angularjs的HTTPS

时间:2014-03-27 13:46:04

标签: javascript angularjs .htaccess mod-rewrite ssl

在我们的应用程序中,我们有一个支付页面,我们要使用SSL,因为我们正在处理信用卡信息。我们已经为apache制定了重写规则,将请求重定向到特定页面的HTTPS - 这会处理对付款页面的任何直接请求(http://oursite.com/pay)。

然而,我们网站中的大多数导航是通过相对网址和states在angularjs中使用ui-router完成的,我们发现apache不会捕获这些请求,因此无需SSL即可提供页面。

EX如果用户单击带有ui-sref='pay' ui-router的链接,则会加载模板并刷新状态 - 在任何时候都不会向服务器请求新的uri,因此apache可以' t重定向到https

有没有办法强制ui-router(或一般角度)强制状态使用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 个答案:

答案 0 :(得分:36)

虽然在SPA应用程序中使用了$ routeProvider,但我遇到了类似的问题。我所做的是在控制器内强制执行重定向:

var forceSSL = function () {
    if ($location.protocol() !== 'https') {
        $window.location.href = $location.absUrl().replace('http', 'https');
    }
};
forceSSL();

这会重新加载所有资源。但是,切换到SSL模式时只会发生一次。

注意,该功能实际上是在服务中,因此可以从任何地方调用。

我希望这会有所帮助。