Javascript 强制特定页面与angularjs一起使用HTTPS

Javascript 强制特定页面与angularjs一起使用HTTPS,javascript,angularjs,.htaccess,mod-rewrite,ssl,Javascript,Angularjs,.htaccess,Mod Rewrite,Ssl,在我们的应用程序中,我们有一个要使用SSL的支付页面,因为我们正在处理信用卡信息。我们已经为apache制定了重写规则,将特定页面的请求重定向到HTTPS——这将处理任何直接请求到支付页面() 然而,我们站点中的大多数导航都是通过相对URL完成的,并且在angularjs中使用状态,我们发现apache无法捕获这些请求,因此在没有SSL的情况下为页面提供服务 例如,如果用户单击带有ui-sref='pay'ui-router的链接,则加载模板并刷新状态——在任何情况下都不会向服务器请求新的uri

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

然而,我们站点中的大多数导航都是通过相对URL完成的,并且在angularjs中使用
状态
,我们发现apache无法捕获这些请求,因此在没有SSL的情况下为页面提供服务


例如,如果用户单击带有
ui-sref='pay'
ui-router
的链接,则加载模板并刷新状态——在任何情况下都不会向服务器请求新的uri,因此apache无法重定向到https

有没有一种方法可以强制用户界面路由器(或一般的角度路由器)强制某个状态使用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]
第二套规则是为我们的应用程序强制执行HTML5模式


RewriteCond%{REQUEST\u FILENAME}-f
已就位,因此angular可以在不需要SSL的情况下获取状态的支付模板。这样可以吗?

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

var forceSSL = function () {
    if ($location.protocol() !== 'https') {
        $window.location.href = $location.absUrl().replace('http', 'https');
    }
};
forceSSL();
但这确实会重新加载所有资源。但是,当切换到SSL模式时,这种情况只发生一次

注意,该函数实际上在服务中,因此可以从任何地方调用


我希望这能有所帮助。

是的,它看起来不错。但我也需要一个强制使用https客户端的解决方案!您所说的强制使用https客户端是什么意思?您想通过JS而不是.htaccess来执行此操作吗?如果用户单击带有
ui sref='pay'
ui-router
的链接,则加载模板并刷新状态——在任何情况下都不会向服务器请求新的uri,因此apache无法重定向到https。重写规则涵盖人们直接访问
domain.com/pay
的情况,但不包括ui路由器处理导航的情况。我需要将
pay
状态下的ui路由器重定向到https。要么这样做,要么把所有链接都链接到
/pay
绝对
hrefs
,我不想这样做。我们最终用SSL实现了整个站点,并在htaccess中使用了重写规则,但这是可行的!谢谢
replace('http','https')
-我建议谨慎使用,因为URL中可能多次出现'http'字符串。实际上,在这种特殊情况下,replace只会在第一次出现'http'时发生。要在全局范围内实现,一种方法是$location.absUrl().replace(/http/g,'https');干得好!只是做了一些小的语法修正。