Виявити HTTP або HTTPS, а потім змусити HTTPS у JavaScript


298

Чи є спосіб виявити HTTP або HTTPS, а потім змусити використовувати HTTPS за допомогою JavaScript?

У мене є кілька кодів для виявлення HTTP або HTTPS, але я не можу змусити його використовувати https:.

Я використовую властивість window.location.protocol для встановлення будь-якого сайту, щоб https:потім оновити сторінку, щоб сподіватися перезавантажити новий https'ed URL, завантажений у браузер.

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

15
Це набагато надійніше (та ефективніше) керується стороною сервера.
Квентін

3
Я думаю, ти маєш рацію. Як зловмисник, який використовує атаку MITM, я міг просто видалити цей код. Тож він пропонує лише захист від пасивних атак.
ndevln


1
@NeoDevlin зловмисник MITM на http також може замінити переадресацію на сторону сервера
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 Це не повинно мати жодного значення. Вони обоє завжди будуть струнами. Якщо один був числом або булевим, то це може змінити значення.
Сум’я

15
location.replace(url)було б набагато краще, ніж location.href = urlу цьому випадку. Ви не хочете, щоб це перенаправлення в історії веб-переглядача або користувач натискав кнопку "назад", щоб знову перенаправитись.
Франциско Зарабобозо

58

Встановлення 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.
Мартін Стеннард

2
location.protocol = "https";Здається, працює, хоча у firefox 28
Нік Расселр

1
Лайно, що порушує кнопку назад. Використовуйте location.replaceзамість цього.
Войовничий шимпанзе

22

Це не гарна ідея, тому що ви просто тимчасові перенаправлення користувача на https та браузер не зберігає цю переадресацію.

Ви описуєте завдання для веб-сервера (apache, nginx тощо) http 301, http 302


3
згоден. Вимушування https на сервері набагато надійніше
Hoàng Long

3
Я міг би бачити його використання, якщо важливо зберегти хеш-значення. Він не надсилається на сервер, а деякі браузери не зберігають його.
Джейсон Райс

Ось посилання на Установити веб-сайт Azure лише для https ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/…
OzBob

1
Не обов'язково правда. Існує школа думки, що 301 - диявол з причин кешування. getluky.net/2010/12/14/301-redirects-cannot-be-undon
Fivedogit

2
Хоча це правда, що це взагалі не годиться робити цього клієнта, але це не те, що просили. І ви не показуєте, як це зробити, отже, це не відповідь. Крім того, в ці дні статичних веб-сторінок часто немає можливості зробити це на стороні сервера (подумайте на сторінках Github), тобто ви повинні це зробити на клієнті. Тим не менш, ви можете допомогти покращити пошук, додавши канонічні теги посилань, щоб уникнути попадання людей на не-ssl версію.
олігофрен

16

Як щодо цього?

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

В ідеалі ви хочете зробити це на стороні сервера.


йому не вистачає порту
eadmaster


5

Це не спосіб JavaScript відповісти на це, але якщо ви використовуєте CloudFlare, ви можете писати правила сторінки, які перенаправляють користувача набагато швидше до HTTPS, і це безкоштовно. Виглядає так у Правилах сторінки CloudFlare:

введіть тут опис зображення


Я насправді вважав це дуже корисним не для відповіді на запитання як оформленого, а для надання корисної інформації про можливо більш надійний спосіб служби SaaS, який не пропонує постійно включений SSL.
MrMesees

3

Ви можете зробити:

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

Це працює. Це стандартний спосіб перенаправлення? це буде працювати у всіх браузерах?
махфуз



0

Мені подобаються відповіді на це питання. Але щоб бути творчим, я хотів би поділитися ще одним способом:

<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?
Антоній

-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-скрипті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.