HTTPまたはHTTPSを検出し、JavaScriptでHTTPSを強制する


298

HTTPまたはHTTPSを検出し、JavaScriptでHTTPSの使用を強制する方法はありますか?

HTTPまたはHTTPSを検出するためのコードがいくつかありますが、強制的に使用することはできませんhttps:

私はwindow.location.protocolプロパティを使用して、サイトが何であるかを設定してからhttps:、ページを更新して、ブラウザーに読み込まれた新しいhttpsのURLをうまくリロードします。

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}

15
これは、はるかに確実に(そして効率的に)サーバー側で処理されます。
クエンティン

3
私はあなたが正しいと思います。MITM攻撃を使用する攻撃者として、私はこのコードを削除することができました。したがって、パッシブ攻撃に対する保護のみを提供します。
ndevln 2014年


1
httpのMITM攻撃者である@NeoDevlinは、サーバー側のリダイレクトも置き換えることができます
Alex Lehmann

1
丁度。2018年、HSTSを使用しない言い訳はありません。これがHTTPSを強制する唯一の安全な方法です。

回答:


500

これを試して

if (location.protocol !== 'https:') {
    location.replace(`https:${location.href.substring(location.protocol.length)}`);
}

location.href = blahこのリダイレクトをブラウザの履歴に追加します。ユーザーが戻るボタンを押すと、同じページにリダイレクトされます。location.replaceこのリダイレクトはブラウザの履歴に追加されないため、使用することをお勧めします。


3
なぜwindowありませんかdocument
webjay


11
文字列を比較する必要があります!==か?
ウェスターナー

5
@WesTurnerどちらの方法でもかまいません。どちらも常に文字列になります。数値またはブール値の場合、違いが生じる可能性があります。
Soumya 2014年

15
location.replace(url)location.href = urlこの場合よりもはるかに良いでしょう。ブラウザーの履歴でこのリダイレクトをしたくない、またはユーザーが戻るボタンを押して再びリダイレクトされるのを望まない。
Francisco Zarabozo

59

location.protocolを設定すると、新しいURLに移動します。何も解析/スライスする必要はありません。

if (location.protocol !== "https:") {
  location.protocol = "https:";
}

Firefoxの49は持っているバグhttps動作しますが、https:しませんが。Firefox 54修正されると言われています。


2
if window.location.href.match('http:') window.location.href = window.location.href.replace('http', 'https')最新のFFとChromeで動作します。
Martin Stannard、

2
location.protocol = "https";Firefox 28でも機能するようです
Nick Russler 2014

1
戻るボタンを壊すクラップ。location.replace代わりに使用してください。
好戦的なチンパンジー

22

一時的なものだからユーザーをにhttpsにリダイレクトでブラウザはこのリダイレクトを保存しないため、ません。

Webサーバー(apache、nginxなど)のタスクを記述します。http301 、http 302


3
同意する。サーバー上でHTTPSを強制するとはるかに信頼性がある
ホアンロング

3
ハッシュ値を保持することが重要である場合、それが使用されているのを見ることができました。これはサーバーに送信されず、一部のブラウザーでは保存されません。
Jason Rice

ここでは、HTTPS用の設定のAzureのWebサイトへのリンクだけ...だblogs.msdn.com/b/benjaminperkins/archive/2014/01/07/...
OzBob

1
必ずしもそうではありません。キャッシングの理由から、301は悪魔であるという見方があります。getluky.net/2010/12/14/301-redirects-cannot-be-undon
fivedogit

2
このクライアント側を実行することは一般に良い考えではないことは事実ですが、これは要求されたものではありません。そして、あなたはそれを行う方法を示さないので、これは答えではありません。また、最近の静的Webページでは、多くの場合、このサーバー側(Githubページなど)を実行する方法がないため、クライアントでこれを実行する必要があります。それでも、正規のリンクタグを追加して検索が改善され、人々が非SSLバージョンにアクセスしないようにすることができます。
オリゴフレン2018

16

これはどう?

if (window.location.protocol !== 'https:') {
    window.location = 'https://' + window.location.hostname + window.location.pathname + window.location.hash;
}

ただし、サーバー側で行うのが理想的です。


ポートがありません
eadmaster


5

これに答えるJavaScriptの方法ではありませんが、CloudFlareを使用する場合、ユーザーをHTTPSにはるかに高速にリダイレクトするページルールを記述でき、無料です。CloudFlareのページルールでは次のようになります。

ここに画像の説明を入力してください


これは実際に非常に便利であるとわかりました。フレームで囲まれた質問に答えるのではなく、常時オンのSSLを提供しないSaaSサービスの信頼性の高い方法についての有用な情報を提供するためです。
MrMesees

3

できるよ:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>

できます。リダイレクトの標準的な方法ですか?すべてのブラウザで動作しますか?
mahfuz



0

この質問の答えが好きです。しかし、創造的であるために、もう1つの方法を共有したいと思います。

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>

-1
<script type="text/javascript">
        function showProtocall() {

            if (window.location.protocol != "https") {
                window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
                window.location.reload();
            }
        }
        showProtocall();
</script>

-1

こんにちは私はこのソリューションを使用して完璧に動作します。チェックする必要はありません。httpsを使用してください。

<script language="javascript" type="text/javascript">
document.location="https:" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
</script>

3
プロトコルがhttpsであってもページを更新しませんか?
Anthony

-2

私は、Pui Cdmによってテストされたすべてのスクリプトバリエーションをテストしました。上記の回答と、php、htaccess、サーバー構成、Javascriptを使用した他の多くの回答が含まれています。その結果、スクリプトは

<script type="text/javascript">        
function showProtocall() {
        if (window.location.protocol != "https") {
            window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
            window.location.reload();
        }
    }
    showProtocall();
</script> 

vivek-srivastavaによって提供される ものが最もよく機能し、Javaスクリプトにさらにセキュリティを追加できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.