it-swarm.dev

사용자가 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');
}

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

BTW, URL에주의를 기울이지 마십시오. 실제로 쇼핑 카트 등이있는 페이지 인 경우 다른 방식으로 수행한다는 것을 알고 있습니다. 신용 카드 정보를 입력하면 한 번에 한 항목을 판매하는 사이트의 페이지로 생각하면 한 번만 카드를 충전 할 목적으로 외부 사이트의 지불 게이트웨이에 제출됩니다.

130
Wiki

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

if ($ _ SERVER [ "HTTPS"]! = "on") 
 {
 header ( "Location : https : //". $ _SERVER [ "HTTP_Host"]. $ _SERVER [ "REQUEST_URI "]); 
 exit (); 
}
168
Adam Rosenfield

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

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

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

45
thebigjc

client 강제로 HTTP Strict Transport Security (HSTS) 헤더를 사용하여 항상 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 헤더를 설정하여 가능한 경우 추가 클라이언트 요청을 브라우저에서 리디렉션해야합니다.

36
Jacob Swartwood

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

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

간단!

15
MatHatrik
// 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);
}
9
Jeff

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

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
itsazzad

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

미끼로 사용하지 않는 한.

$ _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/https 강제

현재 페이지의 전체 URL 가져 오기 (PHP)
부부의 이름을 지정합니다.

5
JSG

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]
4
Jay

$_SERVER['HTTPS'] SSL 인지 알리고 그렇지 않은 경우 올바른 위치로 리디렉션합니다.

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

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

3
DGM

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]
3
siavash bagheri

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"명령이 한 번만 필요하므로 이미 두 번째 줄과 세 번째 줄을 복사하면됩니다.

이게 도움이 되길 바란다.

1
Antonio

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

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

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

1
bourax webmaster

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>
1
Tschallacka

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

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

1
JBB

$ _ 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']가 있고 나머지는 그렇지 않음

0
Tarik

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

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

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

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

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

시작하기에 좋은 곳입니다. 더 이상 제공하지 않아서 죄송합니다. 그러나 당신은 정말로 should SSL을 통해 모든 것을 밀어 넣습니다.

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

0
Kent Fredric

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

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}
0
Héouais Mongars