PHP

[PHP] header Location 리다이렉트 처리가 동작하지 않을 때

현재 페이지가 변경되었거나 더 이상 사용하지 않을 경우 다른 URL로 리다이렉트(Redirect)하고 싶은 경우가 있습니다. 리다이렉트는 서버 응용프로그램의 규칙을 사용하는 방법, 자바스크립트를 사용한 방법, 메타 태그(Meta)를 사용한 방법, 그리고 응답 헤더(Response Header)를 사용하는 방법이 있습니다.

이러한 다양한 방법 중 PHP 코드로 응답 헤더를 보내 리다이렉트를 처리하게 되면 좀 더 간단하고 효율적인 코드가 됩니다. PHP로 리다이렉트를 처리하는 방법은 다음과 같습니다.

<?php
    header("Location: https://jootc.com");
?>

이렇게 하면 입력한 URL로 이동이 될 것입니다. 그러나 간혹 이런 코드를 사용해도 페이지 이동이 처리되지 않는 경우가 있습니다.

이럴 때는 다음의 원인에 해당하는지 확인해보실 필요가 있습니다.

Location 헤더를 넣을 때는 페이지 내에 출력되는 데이터가 없어야 합니다. PHP include() 함수를 통해 HTML 엘리먼트가 출력되었거나, 임의의 텍스트가 print되면 리다이렉트가 처리되지 않을 수 있습니다.

예를 들면 다음과 같습니다. 다음 코드를 실행하면 리다이렉션이 진행되지 않습니다.

<?php
    header("Location: https://jootc.com");
?>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <title>Test page</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
    </body>
</html>

이제 이 문제를 해결해보겠습니다. 해결 방법은 간단합니다. header 함수를 최상단에 넣고, 하단에 exit(); 함수를 실행합니다.

<?php
    header("Location: https://jootc.com");
    exit();
?>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <title>Test page</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
    </body>
</html>

이렇게 하면 exit() 함수 하단에 어떠한 출력문이 있어도 이를 무시하게 되므로 리다이렉트에 문제가 발생하지 않을 것입니다. (즉, 하단의 작업 내용을 유지한 채로 링크 이동을 처리할 수 있습니다.)

또 다른 방법은 header 대신 Javascript script 태그를 사용하여 리다이렉트를 처리하는 방법입니다. location.href 또는 location.replace와 같은 함수를 사용하면 되는데, HTML 코드 내에 삽입하지 않고 PHP 코드 상단에서 실행할 수도 있습니다. 아래와 같이 echo 함수를 사용하여 Script 태그를 불러오게 하면 됩니다.

<?php
    echo "<script>window.location.href='https://jootc.com';</script>";
?>

이렇게 하면 echo 함수 상단에 출력되는 내용이 있어도 별다른 오류 없이 리다이렉트가 처리될 것입니다. 물론 리다이렉션에 시간이 걸린다면 출력되는 내용이 사용자에게 잠시 보일 수 있습니다. 가능하면 이 방법 보다는 PHP의 header 함수를 사용하는 것을 권장합니다.

참고 자료

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

Recent Posts

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

5개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

7개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

7개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

7개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

7개월 ago

윈도우 11 설치 시 Microsoft 계정 로그인 없이 로컬 계정 만들기

언제부턴가 윈도우 11을 처음 설치할 때 마이크로소프트(Microsoft) 계정 로그인을 강제로 요구하게 되었습니다. 물론 마이크로소프트 계정이…

1년 ago