사용자가 HTTP 대신 HTTPS를 통해 내 페이지에 액세스하도록하려면 어떻게해야합니까?


137

HTTPS 페이지 (Apache의 PHP)로 강제로 액세스하려는 페이지가 하나 있습니다. 전체 디렉토리에 HTTPS가 필요하지 않도록하려면 어떻게해야합니까? 또는 HTTP 페이지에서 HTTPS 페이지로 양식을 제출하면 HTTP 대신 HTTPS로 양식을 보내나요?

내 예는 다음과 같습니다.

http://www.example.com/some-page.php

나는 그것을 통해서만 액세스되기를 원합니다.

https://www.example.com/some-page.php

물론이 페이지에 대한 모든 링크를 HTTPS 버전으로 지정할 수는 있지만 일부 HTTP 사용자가 의도적으로 HTTP를 통해 액세스하는 것을 막지는 않습니다 ...

PHP 파일 헤더에 리디렉션을 설정하여 HTTPS 버전에 액세스하고 있는지 확인했습니다.

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

그러나 그것은 올바른 방법이 될 수 없습니다.



3
모든 페이지에 SSL을 요구하지 않는 이유가 있습니까?
Tahaan

답변:


177

내가 전에 한 방식은 기본적으로 작성한 것과 같지만 하드 코딩 된 값이 없습니다.

if ($ _ SERVER [ "HTTPS"]! = "on")
{
    header ( "위치 : https : //". $ _SERVER [ "HTTP_HOST"]. $ _SERVER [ "REQUEST_URI"]);
    출구();
}

15
리디렉션 후 스크립트가 종료되도록 exit ()를 호출하는 것을 잊었습니다. 필자는 보통 requireSSL ()이라는 함수로 랩핑합니다. 암호화하고 싶은 모든 페이지의 맨 위에서 이것을 호출 할 수 있습니다.
Jesse Weigert

31
(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== "on")PHP 통지를 수정 하려면 if를 변경하십시오 .
dave1010

$_SERVER[]변수는 사용자 개입에 따라 변경 가능하거나 취약 하지 않습니까?
Arian Faurtosh

@ArianFaurtosh 소스?
John

3
@ArianFaurtosh는 일부와 같은 클라이언트 헤더에서 추출되어 HTTP_X_FORWARDED조작 할 수 있지만 다른 것은 웹 서버와 유사 HTTPS하거나 SERVER_PORT웹 서버에서 직접 설정되므로 일반적 으로 안전 해야 합니다.
Mahn

46

Apache에서 지시문과 mod_rewrite를 사용하여 수행 할 수 있습니다.

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Location>

원하는 경우 정규 표현식을 사용하여 시간이 지남에 따라 위치를 더 똑똑하게 만들 수 있습니다.


6
이것을 어디에 두시겠습니까? .htaccess 파일?

1
REQUEST_URI에 "query string"(예 :? page = 1 & id = 41 등)이 포함되어 있지 않습니까? 아파치 문서 ... 말하는 그의는 그래서 액세스하려고하면 site.com/index.php?page=1&id=12 내가 리디렉션됩니다 site.com/index.php
롤프

2
아파치 문서에서 : REQUEST_URI 요청 된 URI의 경로 구성 요소 (예 : "/index.html"). 이는 QUERY_STRING이라는 자체 변수로 사용 가능한 쿼리 문자열을 제외합니다. REQUEST_URI 다음에 QUERY_STRING을 추가해야합니다.
Rolf

2
또한 [R] 플래그를 추가하여 리디렉션되도록해야합니다.
Rolf

40

클라이언트 가 항상 HSTS ( HTTP Strict Transport Security ) 헤더를 사용 하여 HTTPS를 요청하도록 해야합니다 .

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

HSTS는 대부분의 최신 브라우저에서 지원되지만 보편적이지는 않습니다. 따라서 위의 논리는 사용자가 HTTP를 사용하는 경우 지원 여부에 관계없이 사용자를 수동으로 리디렉션 한 다음 가능한 경우 추가 클라이언트 요청을 브라우저가 리디렉션하도록 HSTS 헤더를 설정합니다.


나는 다른 대답 이이 헤더를 포함하고 있다는 사실에 놀랐습니다. 매우 중요합니다 ... 두 가지를 결합하기위한 함정은 무엇입니까?
keisar

아니요 ... HTTPS를 항상 원한다면 분명히 해당 헤더를 설정할 수 있습니다. 리디렉션을 수행하기 전후에 설정하는 것은 일종의 중복입니다. 또한 호환성을보다 정확하게 설명하기 위해 위의 응답을 수정했습니다.
Jacob Swartwood

1
(원래 의견 수정) "단일 페이지"의 특정 요구 사항을 알지 못했습니다. HSTS는 모든 페이지에 적용됩니다. 내 대답은 기술적으로 잘못되었습니다.
Jacob Swartwood 2016

4
참고로 표준 RFC 6797 섹션 7.2에 따르면 "HSTS 호스트는 비보안 전송을 통해 전달되는 HTTP 응답에 STS 헤더 필드를 포함해서는 안됩니다." 따라서 요청이 http 일 때 보내지 않아도 브라우저가 표준을 따르는 경우 무시해야합니다.
Frank Forte

1
@mark MITM이 있고 웹 사이트에이 헤더가없는 경우 구성된 세션이 http로 이동하도록 허용 할 수 있으며 사람들은 세부 정보를 입력 할 수 있으며 아마 통지하지 않고 리디렉션이 도움이되지 않습니다 ( 중간은 https를 통해 사이트에 연결하여 http로 표시합니다. 이 헤더를 사용하면 클라이언트 측에서 HTTPS를 강제 실행합니다. 이것은 최근 WPA2 WiFi 보안 취약점으로 인해 특히 중요합니다.
Rudiger

19

방금 .htaccess 파일을 만들고 추가했습니다.

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

간단!


9
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}

8

로드 밸런서 뒤에서 실행할 때 이와 같은 작업을 수행해야했습니다. 모자 팁 https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}

6

PHP 방식 :

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit(1);
}

아파치 mod_rewrite 방식 :

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

SSL 요구 사항을 무시하려는 인스턴스가 있기 때문에 PHP 방식을 선호합니다. 예를 들어, API 및 Mozilla Thunderbird의 자동 구성 등과 같은 기능에 대한 로컬 액세스
Jay

PHP 방법은 나에게 완벽하게 작동하며 적극 권장됩니다.
Moxet 1

5

http://www.besthostratings.com/articles/force-ssl-htaccess.html

때로는 사용자가 보안 연결을 통해 사이트를 탐색하고 있는지 확인해야 할 수도 있습니다. 다음 행을 포함하는 .htaccess 파일을 사용하여 항상 사용자를 보안 연결 (https : //)로 리디렉션하는 쉬운 방법을 수행 할 수 있습니다.

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

.htaccess는 웹 사이트 기본 폴더에 있어야합니다.

특정 폴더에 대해 HTTPS를 강제 적용하려는 경우 다음을 사용할 수 있습니다.

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

.htaccess 파일은 HTTPS를 강제 실행해야하는 폴더에 있어야합니다.


5

자 .. 이제 이것에 많은 것들이 있지만 아무도 "안전한"질문을 완성하지 못합니다. 나를 위해 안전하지 않은 것을 사용하는 것은 비참합니다.

미끼로 사용하지 않는 한.

$ _SERVER 전파는 방법을 아는 사람의 의지에 따라 변경 될 수 있습니다.

또한 Sazzad Tushar Khan과 thebigjc가 언급했듯이 httaccess를 사용 하여이 작업을 수행 할 수 있으며 여기에 많은 답변이 있습니다.

다음을 추가하십시오.

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

.httaccess에있는 것의 끝까지.

여전히 우리는이 두 가지 도구를 사용하는 것만 큼 안전하지 않습니다.

나머지는 간단합니다. 누락 된 속성이있는 경우

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_HOST'],"mywebsite.com") === FALSE){// Something is FISHY
}


또한 httaccess 파일을 업데이트했으며 다음을 확인하십시오.

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

더 많은 변수를 확인할 수 있습니다.

HOST_URI (확인할 정적 속성이있는 경우)

HTTP_USER_AGENT (동일한 세션 다른 값)

따라서 모든 Im의 말은 대답이 조합되어있을 때 하나 또는 다른 것에 대해서만 정착하지 마십시오.

httaccess 재 작성에 대한 자세한 내용은 docs-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

일부 스택-> .htaccess 및 mod_rewrite를 사용하여 SSL / http 강제 실행

전체 URL 가져 오기를 참조하십시오. 현재 페이지 (PHP)
를 사용하여 커플의 이름을 지정하십시오.


2
하지만 이제 다음과 같은 오류가 발생 ERR_TOO_MANY_REDIRECTS합니다. 이 문제를 어떻게 해결합니까?
Pathros

3

사용 $_SERVER['HTTPS']이 경우 알려 SSL 및 올바른 위치로 리디렉션하지 않을 경우.

폼을 표시하는 페이지는 HTTPS를 통해 제공 될 필요가 없으며 가장 필요한 포스트 백 URL입니다.

편집 : 예, 아래에서 지적했듯이 전체 프로세스를 HTTPS로 처리하는 것이 가장 좋습니다. 훨씬 더 안심입니다-게시물이 가장 중요한 부분임을 지적했습니다. 또한 쿠키가 안전하도록 설정되어 있으므로 SSL을 통해서만 전송되도록주의해야합니다. mod_rewrite 솔루션도 매우 훌륭합니다. 제 웹 사이트에서 많은 응용 프로그램을 보호하는 데 사용했습니다.


양식 자체가 https 일 필요는 없지만, 이것을 모르는 대다수의 사람들에게는 좋은 생각입니다. 양식을 제출하려고하는데 자물쇠 아이콘이 없으면 양식이 안전하지 않다고 잘못 판단 할 수 있습니다.
Graeme Perrow

1
@Graeme : 또한 양식이 https를 통해 전송 될 것이라고 아무도 확신 할 수 없습니다. http를 통해 표시되는 전체 양식은 가짜 일 수 있으며 알 수없는 사이트 또는 http 일반 텍스트 사이트에 제출됩니다. Https는 암호화에 관한 것이 아니라 서버를 인증합니다.
올라프 콕

3

사용 htaccess:

#if domain has www. and not https://
  RewriteCond %{HTTPS} =off [NC]
  RewriteCond %{HTTP_HOST} ^(?i:www+\.+[^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]

#if domain has not www.
  RewriteCond %{HTTP_HOST} ^([^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]

1

동일한 페이지에서 HTTP와 HTTPS를 혼합하지 마십시오. HTTP를 통해 제공되는 양식 페이지가있는 경우 데이터 제출에 신경을 씁니다. 제출이 뷰 소스를 수행하지 않고 제출하지 않고 제출이 HTTPS 또는 HTTP를 통과하는지 확인할 수 없습니다.

제출 링크와 함께 HTTPS를 통해 양식을 제공한다고해서 큰 이점은 아닙니다.


1

Apache 또는 .htaccess 파일을 지원하는 LiteSpeed와 같은 것을 사용하는 경우 다음을 수행 할 수 있습니다. .htaccess 파일이없는 경우 루트 디렉토리 (일반적으로 index.php가있는 위치)에 새 .htaccess 파일을 작성해야합니다. 이제 다음 줄을 .htaccess의 첫 번째 다시 쓰기 규칙으로 추가하십시오.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

모든 다시 쓰기 규칙에 대해 .htaccess에 "RewriteEngine On"명령이 한 번만 필요하므로 이미 두 번째 줄과 세 번째 줄을 복사하면됩니다.

이게 도움이 되길 바란다.


이것이 저에게 효과적이며 Zend 2와 유사한 프레임 워크의 자체 스크립트에서 사용하는 것입니다. 공감대를 이해하지 못합니다.
Antonio

어쩌면 1 년 이상 게시 된 @ MatHatrik 의 답변과 거의 동일하기 때문에 다운 투표를 받았습니까?
Wilt

1

이것을 사용하는 것만으로는 충분하지 않습니다.

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}

외부 http 이미지 소스와 같은 http 컨텐츠가있는 경우 브라우저는 가능한 위협을 감지합니다. 따라서 코드 내부의 모든 참조 및 src가 https인지 확인하십시오.


1

$ _SERVER [HTTPS] 의 상태를 확인하는 많은 솔루션을 겪었습니다. 지만 때로는 스크립트를 내부 루프 리디렉션으로 설정하거나 설정하지 않거나 설정하지 않기 때문에 신뢰할 수없는 것처럼 보입니다.

서버가 $ _SERVER를 지원하는 경우 가장 안정적인 솔루션은 다음과 같습니다. [SCRIPT_URI]

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]'>";
    exit;
}

설치에 따라 서버가 $ _SERVER [SCRIPT_URI]를 지원하지 않을 수 있지만 사용하는 것이 더 나은 스크립트입니다.

여기에서 확인할 수 있습니다. 일부 PHP 설치에는 왜 $ _SERVER [ 'SCRIPT_URI']가 있고 다른 것에는 설치되어 있지 않습니다


1

IIS를 사용하는 사람들은 web.config 에이 줄을 추가하면 도움이됩니다.

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
         </rule>
    </rules>
</rewrite>

전체 예제 파일

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>

이 질문은 IIS가 아닌 Apache에 대해 구체적으로 묻습니다.
Quentin

1
A) 태그가없는 아파치. Apache는 따옴표로 묶습니다. B) 일반적인 아파치와 관련이없는 일반적인 질문. 그것은 여러 PHP 지원 웹 서버에 적용 가능
Tschallacka

0

보안상의 이유로해서는 안됩니다. 특히 쿠키가 여기에있는 경우. 쿠키 기반 재생 공격에 대해 폭넓게 개방합니다.

어느 쪽이든 Apache 제어 규칙을 사용하여 조정해야합니다.

그런 다음 HTTPS 사용 여부를 테스트하고 필요에 따라 필요에 따라 리디렉션 할 수 있습니다.

FORM POST (get get) 만 사용하여 지불 페이지로 리디렉션해야하며 POST없이 페이지에 액세스하면 다른 페이지로 다시 연결되어야합니다. (이것은 사람들을 핫 점프하는 것입니다.)

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

시작하기에 좋은 곳이며, 더 이상 제공하지 않은 것에 대해 사과드립니다. 하지만 당신은 정말 해야 SSL을 통해 모든 것을 밀어.

그것은 과잉 보호 적이지만 적어도 걱정은 적습니다.


0

어쩌면 이것이 도움이 될 수 있습니다. 내 웹 사이트에서 내가 한 일입니다. 매력처럼 작동합니다.

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}

0

PHP를 사용 하여이 작업을 수행하려면이 방법이 정말 효과적입니다.


<?php

if(!isset($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != "on") {
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"], true, 301);
    //Prevent the rest of the script from executing.
    exit;
}
?>

$ _SERVER superglobal array에서 HTTPS 변수가 "on"인지 확인합니다. 변수가 on이 아닌 경우


-1

이 스크립트를 사용했으며 사이트를 통해 잘 작동합니다.

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    enter code hereheader('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}

-2
<?php 
// Require https
if ($_SERVER['HTTPS'] != "on") {
    $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
    header("Location: $url");
    exit;
}
?>

쉬워요

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.