JavaScript에서 HTTP 또는 HTTPS를 감지 한 후 강제로 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
이것은 서버 측에서 훨씬 더 안정적으로 (그리고 효율적으로) 처리됩니다.
Quentin

3
그 쪽이 맞는 거 같아요. MITM 공격을 사용하는 공격자로서이 코드를 삭제할 수 있습니다. 따라서 수동 공격에 대해서만 보호 기능을 제공합니다.
ndevln


1
@NeoDevlin http의 MITM 공격자도 서버 측 리디렉션을 대체 할 수 있습니다
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
문자열 비교가되어야 !==합니까?
Wes Turner

5
@WesTurner 어느 쪽이든 상관 없습니다. 그들은 항상 문자열이 될 것입니다. 하나가 숫자이거나 부울 인 경우 차이가 생길 수 있습니다.
Soumya

15
location.replace(url)location.href = url이 경우 보다 훨씬 낫습니다 . 브라우저 기록에서이 리디렉션을 원하지 않거나 사용자가 뒤로 버튼을 누르면 다시 리디렉션됩니다.
Francisco Zarabozo

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에서 작동합니다.
Martin Stannard

2
location.protocol = "https";파이어 폭스 28에서 작동하는 것 같습니다
Nick Russler

1
뒤로 버튼을 깨는 크랩. location.replace대신 사용하십시오 .
Warlike Chimpanzee

22

사용자를 일시적 으로 https로 리디렉션하고 브라우저는이 리디렉션을 저장하지 않기 때문에 좋지 않습니다.

웹 서버 (아파치, nginx 등)에 대한 작업을 설명합니다. http 301, http 302


3
동의하다. 서버에 HTTPS를 강제하는 것은 훨씬 더 신뢰할 수있다
호앙 롱

3
해시 값을 유지하는 것이 중요하다면 사용되는 것을 볼 수 있습니다. 서버로 전송되지 않으며 일부 브라우저는 서버를 보존하지 않습니다.
Jason Rice

https 전용 Azure 웹 사이트 설정에 대한 링크는 다음과 같습니다 ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/…
OzBob

1
반드시 사실은 아닙니다. 캐싱 이유 때문에 301이 악마라고 생각하는 학교가 있습니다. getluky.net/2010/12/14/301-redirects-un-be-unon
fivedogit 15

2
일반적으로이 고객 쪽을 수행하는 것은 좋지 않은 것이 사실이지만, 이것이 요구 된 것은 아닙니다. 그리고 당신은 그것을하는 방법을 보여주지 않으므로 대답이 아닙니다. 또한 오늘날 정적 웹 페이지에서는이 서버 측을 수행 할 수있는 방법이 없습니다 (Github 페이지 생각). 따라서 클라이언트에서이 작업을 수행해야합니다. 그럼에도 불구하고 표준 링크 태그를 추가하여 사람들이 비 SSL 버전을 공격하지 않도록함으로써 검색을 개선 할 수 있습니다.
oligofren

16

이건 어때요?

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

서버 측에서하는 것이 이상적입니다.


포트가 없습니다
eadmaster

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

5

이에 대한 자바 스크립트 방법은 아니지만 CloudFlare를 사용하는 경우 사용자를 훨씬 빠르게 HTTPS로 리디렉션하는 페이지 규칙 을 작성할 수 있으며 무료입니다. CloudFlare의 페이지 규칙에서 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


실제로이 질문은 틀에 박힌 질문에 대답하는 것이 아니라 항상 켜져있는 SSL을 제공하지 않는 SaaS 서비스에 대한보다 안정적인 방법에 대한 유용한 정보를 제공하는 데 매우 유용했습니다.
MrMesees

3

넌 할 수있어:

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

효과가있다. 리디렉션하는 표준 방법입니까? 모든 브라우저에서 작동합니까?
mahfuz



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 인 경우에도 페이지를 새로 고치지 않습니까?
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.