强制特定页面使用 HTTPS 和 angularjs

Posted

技术标签:

【中文标题】强制特定页面使用 HTTPS 和 angularjs【英文标题】:Forcing a specific page to use HTTPS with angularjs 【发布时间】:2014-05-06 12:57:57 【问题描述】:

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

然而,我们网站中的大多数导航都是通过相对 url 和 states 在 angularjs 中使用 ui-router 完成的,我们发现 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 的情况下获取该州的支付模板。这样可以吗?

【问题讨论】:

是的,它看起来不错。 但我也需要一个强制 https 客户端的解决方案! forcing https client-side 是什么意思?你想通过 JS 而不是 .htaccess 来做到这一点? 如果用户单击带有ui-sref='pay' 的链接,ui-router 会加载模板并刷新状态——在任何时候都不会向服务器请求新的 uri,因此 apache 无法重定向到 https。重写规则涵盖人们直接访问domain.com/pay 的情况,但不包括 ui-router 处理导航的情况。我需要将pay 状态的ui-router 重定向到https。要么,要么将所有链接都链接到/pay 绝对hrefs,我不想这样做.. 【参考方案1】:

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

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

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

注意,该函数实际上是在一个服务中,所以可以从任何地方调用。

我希望这会有所帮助。

【讨论】:

我们最终使用 SSL 实现了整个站点,并在 htaccess 中使用了重写规则,但这会奏效!谢谢! replace('http', 'https') - 我建议谨慎使用,因为 URL 中可能会多次出现“http”字符串。 实际上在这种特殊情况下,替换只会在第一次出现“http”时发生。要在全球范围内发生,一种方法是 $location.absUrl().replace(/http/g, 'https'); 干得好!刚刚做了一些小的语法修复。

以上是关于强制特定页面使用 HTTPS 和 angularjs的主要内容,如果未能解决你的问题,请参考以下文章

如何提供到 angularJs 路由页面的特定链接

仅针对某些特定页面将非 www/http 强制为 www/https

关于angularjs中路由页面强制更新的问题

使用 .htaccess 和 mod_rewrite 强制 SSL/https

在 AngularJS 中的 JSON 中添加、删除和更新特定数据

强制视图上的特定大小类