强制特定页面使用 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的主要内容,如果未能解决你的问题,请参考以下文章
仅针对某些特定页面将非 www/http 强制为 www/https
使用 .htaccess 和 mod_rewrite 强制 SSL/https