Определите HTTP или HTTPS, а затем включите HTTPS в JavaScript

298

Есть ли способ обнаружить HTTP или HTTPS и затем принудительно использовать HTTPS с JavaScript?

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

Я использую свойство window.location.protocol, чтобы установить любой сайт, чтобы https:затем обновить страницу, чтобы, надеюсь, перезагрузить новый URL-адрес https, загруженный в браузер.

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}
зарегистрированный пользователь
источник
15
Это гораздо более надежно (и эффективно) обрабатывается на стороне сервера.
Квентин
3
Я думаю, вы правы. Как злоумышленник, использующий атаку MITM, я мог бы просто удалить этот код. Так что он предлагает только защиту от пассивных атак.
ndevln
1
@NeoDevlin злоумышленник MITM на http может также заменить перенаправление на стороне сервера
Алекс Леманн
1
Именно. В 2018 году нет оправдания не использовать HSTS. Это единственный безопасный способ форсировать HTTPS.

Ответы:

501

Попробуй это

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

location.href = blahдобавляет это перенаправление в историю браузера. Если пользователь нажмет кнопку «Назад», он будет перенаправлен обратно на ту же страницу. Лучше использовать, так location.replaceкак он не добавляет это перенаправление в историю браузера.

Soumya
источник
3
Почему windowи нет document?
webjay
11
Должно ли быть сравнение строк !==?
Уэс Тернер
5
@WesTurner Это не должно иметь значения в любом случае. Они оба всегда будут струнами. Если бы один был числом или логическим, то это могло бы иметь значение.
Soumya
15
location.replace(url)было бы намного лучше, чем location.href = urlдля этого случая. Вы не хотите, чтобы это перенаправление в истории браузера или пользователя, нажимающего кнопку «Назад», просто чтобы было перенаправлено снова.
Франциско Сарабосо,
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.
Мартин Станнард
2
location.protocol = "https";кажется, работает, хотя в Firefox 28
Ник Расслер
1
Дерьмо, которое ломает кнопку назад. Используйте location.replaceвместо этого.
Воинственный шимпанзе
22

Это не очень хорошая идея, потому что вы просто временно перенаправляете пользователя на https, а браузер не сохраняет это перенаправление.

Вы описываете задачу для веб-сервера (apache, nginx и т. Д.) Http 301, http 302

b1_
источник
3
согласна. Форсировать https на сервере гораздо надежнее
Hoàng Long
3
Я мог видеть, как он используется, если важно сохранить значение хеша. Он не отправляется на сервер, и некоторые браузеры не сохраняют его.
Джейсон Райс
Вот ссылка на веб-сайт Set 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.
oligofren
16

Как насчет этого?

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

В идеале, вы бы сделали это на стороне сервера.

keirog
источник
порт отсутствует
eadmaster
13
if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')
Стивен Пенни
источник
5

Не Javascript способ ответить на этот вопрос, но если вы используете CloudFlare, вы можете написать правила страницы, которые намного быстрее перенаправляют пользователя на HTTPS, и это бесплатно. Похоже на это в правилах страницы CloudFlare:

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

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

Ты можешь сделать:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>
M.BRAHAM
источник
Оно работает. Это стандартный способ перенаправления? это будет работать во всех браузерах?
Махфуз
1

Функциональный способ

window.location.protocol === 'http:' && (location.href = location.href.replace(/^http:/, 'https:'));
Дмитрий Васильев
источник
0

Мне нравятся ответы на этот вопрос. Но чтобы быть креативным, я хотел бы поделиться еще одним способом:

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>
Чарльз Хэмел
источник
0

В приведенном ниже коде предполагается, что переменная 'str' содержит строку http: // .... Он проверяет, является ли он https, и если true не делает ничего. Однако, если это http, он заменяет http на https.

if (str.indexOf('https') === -1) {
  str = str.replace('http', 'https')
}

Дилетантский код
источник
2
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Дональд Дак
-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>
BrAiNee
источник
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.

Питер
источник