web-dev-qa-db-ja.com

angularjsでHTTPSを使用するように特定のページを強制する

このアプリケーションでは、クレジットカード情報を処理しているため、SSLを使用したい支払いページがあります。特定のページへのリクエストをHTTPSにリダイレクトするためのApacheの書き換えルールはすでに用意されています-これにより、支払いページへの直接のリクエストが処理されます( http://oursite.com/pay =)。

しかし、私たちのサイトのほとんどのナビゲーションは、angularjsで ui-router を使用して相対URLとstatesを介して行われ、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]

ルールの2番目のセットは、アプリにhtml5modeを適用することです。

RewriteCond %{REQUEST_FILENAME} !-fは、SSLを必要とせずにangularが州の支払いテンプレートを取得できるようになっています。これで問題ありませんか?

18

SPAアプリケーションで$ routeProviderを使用していましたが、同様の問題がありました。私がしたことは、コントローラ内でリダイレクトを強制することでした:

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

ただし、これはすべてのリソースをリロードします。ただし、これはSSLモードに切り替えたときに1回だけ発生します。

関数は実際にはサービス内にあるため、どこからでも呼び出すことができることに注意してください。

これがお役に立てば幸いです。

36
Andrej Grobler