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

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');
}

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



답변

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

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


답변

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

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

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


답변

클라이언트 가 항상 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 헤더를 설정합니다.


답변

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

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

간단!


답변

// 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);
}


답변

로드 밸런서 뒤에서 실행할 때 이와 같은 작업을 수행해야했습니다. 모자 팁 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;
    }
}


답변

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]