PHP를 사용하여 HTTP에서 HTTPS로 리디렉션


107

저는 쇼핑 카트 웹 사이트에서 작업 중이며 사용자가 결제 세부 정보를 입력 할 때 HTTPS 페이지로 리디렉션하고 로그 아웃 할 때까지 다음 페이지에 대한 HTTPS 연결을 유지하고 싶습니다.

이 작업을 수행하려면 서버에 무엇을 설치해야합니까 (Apache를 사용 중입니다).이 리디렉션을 PHP에서 어떻게 수행 할 수 있습니까?

답변:


247

다음과 같이 시도해보십시오 (Apache 및 IIS에서 작동해야 함).

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

5
항상 작동하지 않습니다. 나는 그것을 사용해 보았고 $ _SERVER 배열에 'https'요소가 없었기 때문에 '너무 많은 리디렉션'오류가 발생했습니다. 다른 방법을 사용해야합니다.
Usman Zaheer

5
if( $_SERVER['HTTPS'] == "off")이 코드가 작동 하도록 테스트 해야했습니다. 나는 OP와 같은 Apache가 아니라 IIS에 있기 때문이라고 생각합니다.
Nick Pickering

1
@NicholasPickering Jepp, $ _SERVER 변수는 웹 서버에 따라 다를 수 있습니다.
Raphael Michel

6
참고 : die () 또는 exit ()는 페이지의 나머지 부분이 실행되지 않도록 (그리고 가능하면 클라이언트에 추가 정보를 전송하는 것을 방지하기 위해) 헤더 리디렉션 이후에 배치하는 데 중요 할 수 있습니다 (예 : 헤더를 존중하지 않는 해커 또는 브라우저).
dajon

3
서버 환경 / 설정에 따라 $ _SERVER [ 'HTTP_X_FORWARDED_PROTO']를 사용하여 http / https를 확인해야 할 수 있습니다.
David Meister

19

이것은 좋은 방법입니다.

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>

1
물론 좋은으로 표시 한 크롬에서 리디렉션을 적어도 너무 많은 시간을 반환합니다 작품
토마스 J Younsi에게

!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'마지막 부분이 참이면 첫 부분이 거짓이기 때문에 조건 은 항상 거짓입니다.
Max

@Max : 나는 당신이 말하는 것을 이해하지 못합니다. 두 번째 조건이 참 ($ _SERVER [ 'HTTPS'] == 'on')이면 첫 번째 조건도 참이어야합니다 (물론 서버 변수가 값을 포함하고 있기 때문에 설정됩니다!)
OMA

7

IIS에서 PHP를 사용하여 HTTP에서 HTTPS로 리디렉션

MS 인터넷 정보 서비스 (IIS) 버전 6을 실행하는 Windows 서버에서 작동하도록 HTTPS로 리디렉션하는 데 문제가있었습니다 . 저는 Linux 호스트에서 Apache로 작업하는 데 더 익숙해 져서 인터넷에 도움을 요청했으며 "php redirect http to https"를 검색했을 때 가장 높은 순위의 Stack Overflow 질문 이었습니다. 그러나 선택한 답변이 작동하지 않았습니다.

몇 번의 시행 착오 끝에 IIS에서 비 TLS 연결 용 $_SERVER['HTTPS']으로 설정되어 있음을 발견했습니다 off. 다음 코드가 검색 엔진을 통해이 질문에 오는 다른 IIS 사용자에게 도움이 될 것이라고 생각했습니다.

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

편집 : 다른 스택 오버플로 답변 에서 더 간단한 해결책은 확인하는 것 if($_SERVER["HTTPS"] != "on")입니다.


13
@JakeSylvestre 충분히 공정합니다. 이 질문에으로 태그가 지정되지 않았기 때문에 apache검색 엔진을 통해이 페이지를 볼 수있는 다른 IIS 사용자 (내가 있었던 상황과 유사)를 위해이 답변을 게시했습니다. 나는 답변이 OP뿐만 아니라 커뮤니티 전체의 이익을위한 것이라는 견해에 동의합니다.
Anthony Geoghegan

6

당신은 항상 사용할 수 있습니다

header('Location: https://www.domain.com/cart_save/');

저장 URL로 리디렉션합니다.

그러나 .htaccess 및 Apache 재 작성 규칙으로 수행하는 것이 좋습니다.


13
리디렉션하기 전에 항상 $ _SERVER [ 'HTTPS']를 확인하는 것이 좋습니다.
Raphael Michel

$ _SERVER [ 'HTTPS']가 항상 설정되는 것은 아니지만 전에 확인하는 것이 좋습니다. 그렇기 때문에 Apache에서 유용한 재 작성 규칙을 사용하는 것이 좋습니다.이 규칙은 HTTPS가 아닐 때만 리디렉션됩니다.
powtac

Apache는 추가 .htaccess 파일을 사용하지 않는 것이 좋지만 (느려지기 때문에) Apache의 * .conf 내에서 다시 쓰기 규칙을 사용하는 것이 좋습니다.
powtac

1

내 AWS beanstalk 서버에 $ _SERVER [ 'HTTPS'] 변수가 표시되지 않습니다. 'http'또는 'https'가 될 수있는 $ _SERVER [ 'HTTP_X_FORWARDED_PROTO']가 표시되므로 AWS에서 호스팅하는 경우 다음을 사용하십시오.

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.