window.location - 檢測HTTP或HTTPS,然後在JavaScript中強制使用HTTPS




(9)

有什麼方法可以檢測HTTP或HTTPS,然後強制JavaScript使用HTTPS?

我有一些代碼用於檢測HTTP或HTTPS,但我無法強制它使用https:

我正在使用window.location.protocol屬性來設置https:任何網站https:然後刷新頁面,希望重新加載一個新的https'ed URL加載到瀏覽器。

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

Answers

這個怎麼樣?

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

不過,理想情況下,你可以在服務器端進行。


if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')

我剛剛通過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> 

由提供的效果最佳,您可以在java腳本中添加更多安全性。


嘗試這個

if (location.protocol != 'https:')
{
 location.href = 'https:' + window.location.href.substring(window.location.protocol.length);
}

嗨,我用這個解決方案完美無瑕。無需檢查,只需使用https。

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

迎接BrAiNee


不是一種Javascript方式來回答這個問題,但如果你使用CloudFlare,你可以編寫頁面規則 ,將用戶重定向到HTTPS並且它是免費的。 在CloudFlare的頁面規則中看起來像這樣:



這不是個好主意,因為您只是暫時將用戶重定向到https,而瀏覽器不保存此重定向。

你描述了web-server(apache,nginx等) http 301,http 302的任務


這個問題有很多可能的答案。我的回答顯然基於其中的一些。這是我在閱讀完所有答案後最終得到的結論。

$.getScript加載完成後需要回調的任何其他解決方案的問題是,如果您有多個文件使用它並相互依賴,則您無法知道何時加載所有腳本(一旦它們被嵌套)在多個文件中)。

例:

file3.js

var f3obj = "file3";

// Define other stuff

file2.js:

var f2obj = "file2";
$.getScript("file3.js", function(){

    alert(f3obj);

    // Use anything defined in file3.
});

file1.js:

$.getScript("file2.js", function(){
    alert(f3obj); //This will probably fail because file3 is only guaranteed to have loaded inside the callback in file2.
    alert(f2obj);

    // Use anything defined in the loaded script...
});

當你說你可以指定Ajax同步運行或使用XMLHttpRequest,你是對的,但當前的趨勢似乎是棄用同步請求,所以你現在或將來可能無法獲得完整的瀏覽器支持。

您可以嘗試使用$.when來檢查延遲對象的數組,但現在您在每個文件中執行此操作,並且file2將在$.when執行時被視為已加載,而不是在執行回調時,因此file1仍然在加載file3之前繼續執行。這仍然有同樣的問題。

我決定倒退而不是前鋒。謝謝document.writeln。我知道這是禁忌,但只要使用得當,這種方法效果很好。您最終得到的代碼可以輕鬆調試,正確顯示在DOM中,並且可以確保正確加載依賴項的順序。

你當然可以使用$(“body”)。append(),但是你再也無法正確調試了。

注意:您必須僅在頁面加載時使用此選項,否則您將獲得一個空白屏幕。換句話說,始終將此放在document.ready之前/之外。在點擊事件或類似事件中加載頁面後,我沒有使用過此測試,但我很確定它會失敗。

我喜歡擴展jQuery的想法,但顯然你不需要。

在調用之前document.writeln,它會通過評估所有腳本元素來檢查以確保腳本尚未加載。

我假設腳本在其document.ready事件執行之前未完全執行。(我知道使用document.ready不是必需的,但很多人使用它,處理這是一個安全措施。)

加載其他文件後,document.ready回調將以錯誤的順序執行。為了在實際加載腳本時解決此問題,導入它的腳本將自行重新導入並暫停執行。這會導致原始文件現在在其document.ready導入的任何腳本之後執行其回調。

您可以嘗試修改jQuery readyList,而不是這種方法,但這似乎是一個更糟糕的解決方案。

解:

$.extend(true,
{
    import_js : function(scriptpath, reAddLast)
    {
        if (typeof reAddLast === "undefined" || reAddLast === null)
        {
            reAddLast = true; // Default this value to true. It is not used by the end user, only to facilitate recursion correctly.
        }

        var found = false;
        if (reAddLast == true) // If we are re-adding the originating script we do not care if it has already been added.
        {
            found = $('script').filter(function () {
                return ($(this).attr('src') == scriptpath);
            }).length != 0; // jQuery to check if the script already exists. (replace it with straight JavaScript if you don't like jQuery.
        }

        if (found == false) {

            var callingScriptPath = $('script').last().attr("src"); // Get the script that is currently loading. Again this creates a limitation where this should not be used in a button, and only before document.ready.

            document.writeln("<script type='text/javascript' src='" + scriptpath + "'></script>"); // Add the script to the document using writeln

            if (reAddLast)
            {
                $.import_js(callingScriptPath, false); // Call itself with the originating script to fix the order.
                throw 'Readding script to correct order: ' + scriptpath + ' < ' + callingScriptPath; // This halts execution of the originating script since it is getting reloaded. If you put a try / catch around the call to $.import_js you results will vary.
            }
            return true;
        }
        return false;
    }
});

用法:

文件3:

var f3obj = "file3";

// Define other stuff
$(function(){
    f3obj = "file3docready";
});

文件2:

$.import_js('js/file3.js');
var f2obj = "file2";
$(function(){
    f2obj = "file2docready";
});

文件1:

$.import_js('js/file2.js');

// Use objects from file2 or file3
alert(f3obj); // "file3"
alert(f2obj); // "file2"

$(function(){
    // Use objects from file2 or file3 some more.
    alert(f3obj); //"file3docready"
    alert(f2obj); //"file2docready"
});




javascript https window.location