php 입문 | 페이지 전환, 쿠키, 세션 | HTTP 헤더 및 페이지 이동

Web 응용 프로그램이라는 것은 일반적인 PC의 응용 프로그램 등과는 많이 다른 기술이 사용되고 있다. 그러한 ‘Web 특유의 기술’에 대해 PHP에서의 사용을 설명하고 가겠다. 우선 “페이지 이동"에 대해 설명하겠다.

Web에서는 화면의 표시는 각각 다른 Web 페이지로 구성되어 있다. 그리고 필요에 따라 다른 페이지로 이동하면서 표시를 변경해 간다. 이것이 “페이지 이동"이다.

중요한 것은 “페이지 이동되면 그 이전까지의 정보는 깨끗이 제거된다"라는 점이다 (물론, 정보를 유지하는 방법도 있다. 이는 나중에 설명하겠다). 먼저 폼(form)의 송신을 했었는데, 양식이 송신되면 대상 페이지가 처음부터 읽어서 변경되고 모든 새로 만들어 진다.

따라서 Web 응용 프로그램에서 페이지 이동할 경우에는 이 “페이지 이동시 이전 정보는 단절된다"라는 것을 생각해 두어야 한다. 그래서 필요한 정보를 유지하는 방법 등을 고려하면서 Web 응용 프로그램을 설계해 나가야 된다.

그럼 서두는 여기까지 하고, 페이지 이동에 대해 설명하겠다. 페이지 이동은 “header"라는 함수를 이용하여 수행한다. 이것은 다음과 같이 실행한다.

header(헤더에 출력할 내용);

왠지 잘 모르겠는가? 이 header 함수라는 것은 HTTP 프로토콜의 “헤더"에 텍스트를 출력하는 함수이다. 왜 그것이 페이지 이동과 관계 있을까? 그것은 헤더에 페이지 이동 정보를 제공함으로써, 그것을 받은 브라우저에서 리다이렉트(redirect)을 수행하기 때문이다.

원래 Web 페이지는 “HTTP"라는 프로토콜을 사용하여 전송되고 있다는 것은 알고 있을 것이다. HTTP는 Web 서버와 클라이언트(Web 브라우저) 사이에서 어떤 절차로 교환할 것인지에 대한 결정된 규칙과 같은 것이다. 이 HTTP라는 약속 및 규칙에 따라 서버와 브라우저 사이에서 필요한 정보를 주고 받으면서 Web 페이지 액세스를 실시한다.

서버에서 Web 페이지를 보내올 때, 먼저 서버에서 브라우저에 알려주고 싶은 다양한 정보를 헤더에 담고, 그 다음에 Web 페이지 본체에 해당하는 바디(body)를 이어서 붙여 보내도록 되어 있다. 즉, 헤더는 “페이지로 표시되지 않는 정보"이다. 이 헤더 부분에 필요한 정보를 내보내는 것이 header 함수이다.

페이지 이동을 할 경우에는 헤더에 “Location:대상 주소"라고 텍스트를 써도 전달한다. 이 Location라는 헤더를 수신한 브라우저는 전달된 주소로 리다이렉트(페이지 이동)을 시킨다. 이 헤더를 제공함으로써 그것을 받은 브라우저는 지정된 페이지에 다시 액세스하여 페이지를 변경한다.

header 함수로 페이지 이동

그럼 페이지 이동의 간단한 예제를 만들어 보도록 하겠다.

index.php의 내용

<?php
    if ($_POST != null){
        $url = $_POST['text1'];
        header("Location:{$url}");
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p><?php echo $url; ?></p>
        <hr>
        <form method="post" action="./index.php">
            <input type="text" name="text1" value="./index2.php">
            <input type="submit" value="이동">
        </form>
        <hr>
    </body>
</html>

index2.php의 내용

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta http-equiv="Content-Type"  content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Index2.php!</h1>
        <p>새로운 준비한 페이지입니다.</p>
        <hr>
    </body>
</html>

여기에 index.php와 index2.php라는 2개의 파일을 같은 위치에 생성한다. index.php에서 버튼을 누르면 index2.php로 이동하는 것을 볼수 있을 거다.

실제로 해보면, “이것이 <a> 태그로 이동하는 것과 무엇이 다른가?“라고 생각할지도 모른다. 하지만 분명히 다르다! <a> 태그는 단지 지정한 페이지로 이동하면 되지만, 이것은 먼저 페이지에 쓰여져 있는 PHP 스크립트를 실행하고, 그 안에서 이동을 지정할 수 있다는 점이다. 즉, 서버에서 스크립트가 처리되는 단계에서 그것을 받은 클라이언트에 “이 페이지로 이동하라"고 지정할 수 있다. 따라서 필요한 작업 및 페이지 이동을 결합할 수 있다.

이 header에 의한 페이지 이동에 주의해야 할 점은 “header를 실행하면, 이후 처리는 취소된다"는 것이다. 이는 header을 브라우저가 가져온 단계에서 해당 페이지로 이동해 버리기 때문에, 그 이후에 무엇이 적혀 있어도 의미가 없게 된다. Location을 header로 쓰기 전에 모든 처리를 해야 한다.

또 하나의 주의 점은 header는 뭔가를 출력하기 전에 실행하지 않으면 안된다. 이는 자주 발생하는 문제이다. 헤더는 본문 전에 전송되기에 echo와 HTML 태그 등이 써서 무언가가 출력하려고 하면 자동으로 그 시점에서 헤더를 먼저 보내 버린다. 일단 헤더가 보내지면 다른 헤더는 재전송 할 수 없다.

따라서 header 함수는 반드시 뭔가를 출력하기 전에 실행을 해야 한다. PHP는 HTML 태그안에 스크립트를 작성하기 때문에, 태그 이외에 어떤 무엇이라도 뭔가 쓰여지게 되면 그대로 바로 출력되도록 되어 있다. 그러기 때문에 예를 들어 태그 전에 비록 줄바꿈일지라도 있다면, 이미 header 함수는 사용할 없게 된다 (그 전에 개행 코드가 전송되어 있으므로 이미 헤더가 보내지는 거다). 이 점은 잘 이해하도록 하자.




최종 수정 : 2021-08-27