2010-05-18 2 views
33

Я пытаюсь найти, как определить с помощью JavaScript, если я в среде HTTP или HTTPS.Обнаруживать HTTPS с помощью JavaScript

Я вызываю запрос Ajax, поэтому, если я нахожусь в HTTPS и вызываю HTTP Ajax, тогда я получаю 302 Moved Temporarily.

Я думал о том, чтобы получить текущий window.location.href и выполнить манипуляции с строкой.

Каков наилучший способ обнаружения HTTPS с помощью JavaScript?

+0

@DanDascalescu ты использовал "флаг", чтобы пометить это как дубликат? – HackerKarma

+0

@HackerKarma: Я проголосовал за закрытие три недели назад. Ничего не случилось, и только тогда я использовал флаг. –

+0

@DanDascalescu Спасибо. Я просто отметил, что это близко. Давай посмотрим что происходит. – HackerKarma

ответ

39

Вы можете использовать нестандартную

window.location.protocol 

В Firefox: MDC documentation

В IE, это, кажется,

document.location.protocol 

MSDN documentation

Я не могу найти надежную информацию о том, как это ведет себя в других браузерах, но я ожидаю, что они будут придерживаться квазистандарт document.location.protocol.

Может jQuery url plugin сорта это без необходимости иметь дело с различиями кросс-браузер - я никогда не использовал его сам, но это выглядит многообещающе:

jQuery.url.attr("protocol"); 
+0

+1: это более общий способ для него :) – Sarfraz

8

location.protocol работает на всех браузерах.

+1

Существует более двух браузеров :) –

+4

ouch! спасибо, что привязали меня к реальности :) –

57

Глядя на то, как Google Analytics добавить свой скрипт на странице:

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 

Тогда document.location.protocol будет казаться безопасным для всех браузеров.

+0

Отличное понимание. Работает безупречно. – xaragen

0

Существует очень аккуратный lib под названием URI для таких вещей. https://github.com/medialize/URI.js

Возможно, вам это не нужно, чтобы захватить протокол, но если вы собираетесь манипулировать URI, вы должны использовать это.

5

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

var protocol = window.location.href.indexOf("https://")==0?"https":"http"; 
+0

должен быть протоколом = window.location.href.indexOf ("https: //") == 0? "Https": "http"; –

+0

прав, спасибо! –

4

Во многих случаях можно вообще опустить протокол. Таким образом, вместо

<img src="https://test.com/image.jpg" /> 

можно использовать

<img src="//test.com/image.jpg" /> 

Браузер затем добавляет текущий протокол автоматически. Это также работает для включения файлов в голову, и это также должно работать для вызовов ajax.

Edit: Делая это теперь считается анти-модель:

Теперь SSL рекомендуется для всех, и не имеет проблем производительности, этот метод в настоящее время является анти-модель. Если необходимый вам ресурс доступен по протоколу SSL, всегда используйте ресурс https: //.

Разрешающий фрагмент запроса через HTTP открывает дверь для атак, таких как недавняя атака Github Man-on-side. Всегда безопасно запрашивать активы HTTPS, даже если ваш сайт находится на HTTP, однако обратное неверно.

см: http://www.paulirish.com/2010/the-protocol-relative-url/

+0

подтвердил, что это работает для вызовов ajax ... по крайней мере, с помощью AngularJS '$ http.get ('// example.com')' – parliament

+3

Одно предостережение, с которым я столкнулся, заключается в том, что этот ответ не будет работать после развертывания кода на мобильное устройство (если вы используете Cordova или PhoneGap). В этом siutation // будет разрешено file: // поэтому вы никогда не сможете использовать его для http-вызовов. Если вы не разрабатываете для мобильных устройств, просто игнорируйте это. – parliament

Смежные вопросы