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]