HTTPS를 HTTP로 어떻게 리디렉션합니까?


166

HTTPS를 HTTP로 어떻게 리디렉션합니까? 즉, 모든 사람들이 가르치는 것과는 정반대입니다.

SSL 인증을 지불 한 HTTPS 서버와 비상 사태에 대비하지 않은 미러가있어 인증을받을 가치가 없습니다.

내 고객의 데스크탑에는 http://production_serverhttps://production_server(둘 다 작동) 가리키는 일부 바로 가기가 있습니다. 그러나 프로덕션 서버가 다운되면 DNS 전달이 시작되고 바로 가기에 "https"가있는 클라이언트가 https://mirror_server작동하지 않는 큰 Internet Explorer 7 빨간색 화면을 쳐다보고 있습니다. 우리 회사를 위해서

불행히도, 나는 이것을 클라이언트 수준에서 바꿀 수 없습니다. 이러한 사용자는 컴퓨터를 잘 모르는 사람이며 HTTPS "보안"오류 (특히 Firefox 3 및 Internet Explorer 7에서 요즘 처리하는 방식 : FULL STOP, 고맙지 만 일종의 LOL을 도와주지 않음) 오류가 발생할 가능성이 매우 높습니다.

그것은이다 매우 쉽게 찾을 아파치 솔루션 에 대한 HTTP-> HTTPS 리디렉션을 하지만, 내 인생 내가 반대 할 수 없습니다.

아이디어?


2
그거 하지마 ! HTTP의 HTTPS 리디렉션은 다음과 같은 경우를 제외하고는 자동 HTTP 상태를 통한 노드 인 경우에 매우 위험합니다 (실제로 악용으로 인해 곧 모든 브라우저에서 차단됨). (1) 사용자가 링크를 클릭하여 적극적으로 클릭하도록 초대하는 일시적인 HTTPS 주차 페이지가 있습니다. 또는 :-(2) HTTPS가 정확히 동일한 SAME 도메인 에서 HTTP로 리디렉션되고 리디렉션으로 인해 요청 된 컨텐츠 유형이 변경되지 않습니다. 브라우저에서 허용하면 많은 맬웨어가 격리를 통과 할 수 있습니다. 이러한 리디렉션은 매우 기만적입니다.
verdy_p

4
이것은 내부 사이트처럼 보이며 OP가 어떤 일을하고 있는지 알기 때문에 위험하지 않습니다 ... 이것이 웹 서버 인 경우, 귀하는 동의하지만 내부의 로컬 전용 웹 서버는 이 방식은 문제가되지 않습니다.
Stese

@verdy_p 캡 티브 포털의 경우 HTTPS에서 HTTP 302 리디렉션으로 작업하고 있습니다. 당신이 말하는 문서를 알려 주시겠습니까?
jprusakova

캡 티브 포털의 경우 정확히 동일한 도메인 (하위 도메인이 아님) 인 경우를 제외하고 HTTPS에서 HTTP 302 로의 리디렉션을 수행하지 마십시오. 정보 유출 위험이 높으므로 세션 토큰과 쿠키는 리디렉션을 통해 투명하게 전달됩니다. HTTP 대상을 조정하고 악성 프로그램 투명 프록시 및 악의적 인 DNS를 통해 정보를 가져올 수 있음을 알고 있어야합니다. 고객의 mayu는 HTTP 전용 대상에 도달 할 수 없으며 실제로 블랙 햇으로 이동할 것임을 알지 못합니다! 따라서 개인 세션 / 쿠키 / 요청이 포함 된 HTTPS 링크에서는 절대 그렇게하지 마십시오.
verdy_p

이러한 HTTPS 302 리디렉션은 항상 HTTPS 사이트의 보안 허점입니다. 세션을 도난 당하고 인증 된 사용자가 개인 계정을 수집 할 위험이 큽니다. 모든 경우에 자바 스크립트 또는 활성 멀티미디어를로드하기 위해 이러한 리디렉션을 수행하지 마십시오. 이는 HTTPS "샌드 박스"영역에서 열린 문입니다. HTTP를 HTTPS로 리디렉션하고 (특히 개인 데이터 / 세션 / 쿠키가 필요없는 기본 포털 또는 정적 퍼블릭 페이지) HTTP를 HTTPS로 사용하십시오. HTTPS에서 HTTP로
가져와야

답변:


128

이것은 테스트되지 않았지만 mod_rewrite를 사용하여 작동해야한다고 생각합니다.

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

1
어떻게 작동하게합니까 (이 코드를 작동 시키려면이 코드를 도메인으로 변경해야합니까?)
Enve

1
Enve : 사이트의 vhost_ssl.conf 구성 (또는 사이트 루트의 .htaccess)에 추가하십시오. 변경할 필요는 없으며 동일한 호스트 이름과 URL 경로를 동적으로 사용합니다.
Darren Felton

1
쿼리 문자열을 잡고 싶을 수도 있습니다. 확실하지 않지만 위의 스 니펫은 쿼리 문자열을 https에서 http로 전달하지 않을 것이라고 생각합니다.
Rustavore

12
아래 Kieron이 지적한 것처럼 미러 서버에 유효한 인증서가 없으면 작동하지 않습니다. 유효하지 않은 인증서로 인해 여전히 큰 빨간색 경고가 표시됩니다. https를 사용하기 시작하면 기본적으로 https가 붙어 있습니다. 평생 동안 지불 할 준비를하십시오. 지불을 중단하면 https 링크를 북마크에 추가 한 사용자는 통과 할 수 없습니다.
Stephen Cheng

2
남은 생애에 돈을 지불? 여전히 HTTPS를 사용할 수 있지만 PKI 공급자를 변경하고 더 저렴한 새 인증서를 받으십시오. 그래도 몇 달러를 지불하지만 도메인 이름과 호스팅에 대해서도 마찬가지입니다! PKI 인증서는 이제 도메인 이름에 비해 비싸지 않으며 호스팅 / 대역폭 비용에 비해 중요하지 않습니다!
verdy_p

71

Rewrite 엔진은 HTTP 요청이 수신 된 후에 만 ​​시작됩니다. 즉, 클라이언트가 요청을 보내도록 연결을 설정하려면 인증서가 여전히 필요합니다.

그러나 백업 시스템이 클라이언트와 관련하여 동일한 호스트 이름을 갖는 것처럼 보이는 경우 기본 프로덕션 시스템과 동일한 인증서를 사용할 수 없습니다.


1
이 한계를 어떻게 극복 할 수 있습니까? 같은 문제가 있습니다. 리디렉션 전에 브라우저에서 인증서 오류가 발생합니다.
Sandeep Balagopal

인증서 오류가있는 경우 HTTP로 다시 리디렉션하는 것이 좋습니다.
Jeffrey the Giraffe

그것은 처음부터 HTTPS를 갖는 목적을 완전히
상실합니다

12

ejunker의 답변을 바탕으로, 이것은 단일 서버가 아니라 클라우드 환경 에서 나를 위해 일하는 솔루션입니다.

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

301을 사용하면 위험 할 수 있습니다. 301은 영구적으로 제거되었음을 의미하며 https에서 http로 이동하는 것이 일시적인 것 같습니다. 단점은 사용자를 위해 일 무슨이 허용 대답을 참조하십시오 stackoverflow.com/questions/1393280/...
유 서프 tezel

301/302 영구 / 임시 구별은 검색 엔진에만 관련이 있습니다.
matthewv789

9

.conf파일을 사용하는 사람들을 위해 .

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>

8

위의 해결책 중 어느 것도 당신을 위해 작동하지 않으면 (그들이 나를 위해하지 않은) 여기 내 서버에서 작동 한 것입니다.

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

6
종종 L,"마지막 규칙"을 원하지 않는 경우가 있습니다 . 워드 프레스 또는 다른 CMS를 사용하는 경우 L플래그로 인해 페이지 요청이 올바르게 라우팅되지 않을 수 있습니다. 대신 사용하십시오 :RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore

5

cloudflare를 사용할 때 위의 모든 기능이 작동하지 않았습니다.

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

그리고 이것은 확실히 프록시없이 작동합니다 :

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

3

가능하면 mod_rewrite를 사용하지 않는 것이 좋습니다.

귀하의 경우에는 Rewrite를 다음과 같이 바꾸십시오.

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

<If>지침이 따라 2.4+ 아파치에서만 사용할 수 있습니다 여기 블로그 .


호스팅 환경에서 다음을 사용하여 Apache 버전을 확인할 수 있습니다./usr/sbin/httpd -v
Serge Stroobandt

1

이것은 나를 위해 작동합니다.

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

포트 80과 443을 모두 들어야합니다.


0

Wordpress 웹 사이트에서 나에게 맞는 답변은 없지만 다음 작품은 작동합니다 (다른 답변과 비슷하지만 약간의 변화가 있습니다)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

모든 REQUEST_URI와 함께 이러한 규칙을 맹목적으로 사용하지 마십시오 (URI에 양식 데이터가 있거나 요청 메타 데이터에 쿠키 / 세션 ID가있는 경우 사용해서는 안 됨). 정적 공개 페이지 / 이미지에만 사용하십시오. 자바 스크립트 또는 활성 구성 요소 (예 : 스크립트 가능한 비디오 스트림 또는 사용자가 디지털 서명하지 않은 경우 활성 PDF)의 경우이를 피하십시오. 여전히 자바 스크립트에 디지털 서명을 할 수 없으며 보안 도메인에만 유지하십시오.
verdy_p

참고 : 일부 이미지 형식은 활성화되어 있고 스크립트 가능합니다. 예를 들어 SVG에주의하십시오. 우리는 HTTP에서 SVG 이미지를로드하는 일부 HTTPS 웹 사이트 (사이트의 302 리디렉션)에 대한 공격을 보았으며 SVG 컨텐츠에 스크립트를 삽입하는 맬웨어에 의해 수집되었습니다 ... 이상적으로 브라우저는 HTTP 하위 컨텐츠를 HTTPS에서 분리하여 샌드 박스에 배치해야합니다 (따라서 CORS 도메인 이름이 같은 경우에도 보안 제한 사항이 적용되어야합니다 ....) "http : // (도메인) / ..."및 "https : // (도메인) /"은 별도의 도메인으로 간주됩니다. 동일한 TCP 포트 번호에있는 CORS (같은 출처가 아님).
verdy_p

@verdy_p, "사이트의 302 리디렉션"이란 정확히 무엇을 의미합니까? HTTP 리소스 요청을 이용하려면 먼저 서버 사이트 (또는 DNS 서버, 라우터와 같은 TCP / IP 레벨의 참여자 노드)를 소유해야합니다.
Sz.

반드시 그런 것은 아닙니다. 도메인의 HTTPS는 안전하지만 동일한 도메인의 HTTP는 안전하지 않습니다 (DNSSEC를 사용하는 경우에도 익스플로잇은 IP, 라우터 또는 DNS 서버를 제어 할 필요가 없습니다. 익스플로잇은 IP 스푸핑 만 사용할 수 있습니다. 보안 세션). 따라서 HTTPS 사이트는 HTTP로 이미지를 제공하지 않음으로써 (같은 도메인에서도) 이미지를 호스팅해야한다고 유지합니다 (활성화가 필요한 일부 브라우저에서는 안전하지 않은 이미지를 가리거나 숨길 수 있습니다). 혼합 HTTPS / HTTP는 금지되어야합니다. 사이트는 HTTP 부분 (예 : 트랙 픽셀)에서 공격 할 수 있습니다.
verdy_p

-6

간단한 메타 새로 고침을 알고있는 한 오류가 발생하지 않습니다.

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">

12
다운 유권자가 다운 투표의 이유를 설명하는 의견을 남기기를 바랍니다. 개인적으로 개발자로서 개발하려는 서버에 액세스 할 수 없지만 페이지에 액세스 할 수 없다면이 답변을 선택하지 않을 것입니다. 한 가지 문제는이 기능을 사용하려면 모든 페이지의 모든 경로를 하드 코딩해야한다는 것입니다. 중요한 사용 사례에 JavaScript가 활성화되어 있다고 가정 할 수 있으면 JavaScript를 사용하여 http로 변경하는 것이 좋습니다. 위의 답변은 서버에서 발생하기 때문에 자바 스크립트가 필요하지 않기 때문에 더 좋습니다.
Rustavore

2
간단히 말해 : htaccess가 그보다 훨씬 더 나은 옵션이기 때문입니다. 또한 인증서가 없으면 https 프로토콜을 http로 리디렉션하는 문제를 해결하지 않습니다.
midudev

1
작업은 서버가 제공하는 'a'문서가 아니라 서버에서 처리해야합니다.
albal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.