[php] PHP에서 리디렉션을 어떻게합니까?

PHP를 사용하여 사용자를 다른 페이지로 리디렉션 할 수 있습니까?

사용자가로 이동하여 www.example.com/page.php로 리디렉션하고 싶다고 말하면 www.example.com/index.php메타 새로 고침을 사용하지 않고 어떻게해야합니까? 가능합니까?

이렇게하면 권한이없는 사용자로부터 내 페이지를 보호 할 수도 있습니다.



답변

기존 답변과 내 자신의 2 센트 요약 :

1. 기본 답변

header()함수를 사용하여 새 HTTP 헤더를 보낼 수 있지만 HTML 또는 텍스트 전에 ( <!DOCTYPE ...>예 : 선언 전에) 브라우저로 보내야합니다 .

header('Location: '.$newURL);

2. 중요한 세부 사항

die () 또는 exit ()

header("Location: http://example.com/myOtherPage.php");
die();

당신이 사용해야하는 이유 die()또는 exit(): 일일 WTF

절대 또는 상대 URL

2014 년 6 월부터 절대 및 상대 URL을 모두 사용할 수 있습니다. 절대 URL 만 허용 된 이전 RFC 2616을 대체 한 RFC 7231 을 참조하십시오 .

상태 코드

PHP의 “위치”헤더는 여전히 HTTP 302 리디렉션 코드를 사용하지만이 코드는 사용해야합니다. 301 (영구적 리디렉션) 또는 303 (기타)을 고려해야합니다 .

참고 : W3C는 303- 헤더가 “많은 pre-HTTP / 1.1 사용자 에이전트와 호환되지 않는다고 언급 합니다. 현재 사용되는 브라우저는 모두 HTTP / 1.1 사용자 에이전트입니다. 이것은 스파이더 및 로봇과 같은 다른 많은 사용자 에이전트에는 해당되지 않습니다.

3. 문서

HTTP 헤더와 header()PHP 의 기능

4. 대안

PECL 패키지 pecl 을 설치 http_redirect($url);해야하는 대체 방법을 사용할 수 있습니다 .

5. 도우미 기능

이 기능은 303 상태 코드를 포함하지 않습니다 :

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

이것은 더 유연합니다.

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. 해결 방법

언급 한 바와 같이 header()리디렉션은 아무것도 작성되기 전에 만 작동합니다. HTML 출력 중에 호출 되면 일반적으로 실패합니다 . 그런 다음 다음과 같은 HTML 헤더 해결 방법을 사용할 수 있습니다.

 <meta http-equiv="refresh" content="0;url=finalpage.html">

또는 JavaScript 리디렉션도 가능합니다.

window.location.replace("http://example.com/");


답변

header()함수 를 사용하여 HTTP Location헤더 를 보내십시오 .

header('Location: '.$newURL);

일부 사람들의 생각과 달리 die()리디렉션과는 아무런 관련이 없습니다. 정상적인 실행 대신 리디렉션하려는 경우 에만 사용하십시오 .

파일 example.php :

<?php
    header('Location: static.html');
    $fh = fopen('/tmp/track.txt', 'a');
    fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') . "\n");
    fclose($fh);
?>

세 가지 실행 결과 :

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

재개-의무적 die()/ exit()실제 PHP와는 아무런 관련이없는 도시의 전설입니다. 클라이언트가 Location:헤더를 “존중”하는 것과는 아무런 관련이 없습니다 . 헤더를 전송해도 사용 된 클라이언트에 관계없이 PHP 실행이 중지되지 않습니다.


답변

function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

die () / exit ()를 잊지 마십시오!


답변

echo를 사용하여 PHP에서 JavaScript를 출력하면 작업이 수행됩니다.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

페이지 출력을 버퍼링 한 다음 나중에 리디렉션 조건을 확인하지 않으면 PHP에서 실제로 할 수 없습니다. 너무 번거로울 수 있습니다. 헤더는 페이지에서 가장 먼저 전송됩니다. 대부분의 리디렉션은 일반적으로 페이지의 뒷부분에 필요합니다. 이를 위해서는 페이지의 모든 출력을 버퍼링하고 나중에 리디렉션 조건을 확인해야합니다. 이 시점에서 페이지 사용자 header ()를 리디렉션하거나 단순히 버퍼링 된 출력을 에코 할 수 있습니다.

버퍼링 (이점)에 대한 자세한 내용

출력 버퍼링이란 무엇입니까?


답변

1. 헤더 기능 사용 exit()

<?php
     header('Location: target-page.php');
     exit();
?>

그러나 헤더 기능을 사용하는 경우 헤더 를 보내기 전에 에코 또는 인쇄하지 않는 문제를 해결하기 위해 “이미 헤더 보내기와 같은 경고”가 표시 되거나 단순히 헤더 기능을 사용 die()하거나 exit()후에 사용할 수 있습니다 .

2. 헤더 없음

<?php
    echo "<script>location.href='target-page.php';</script>";
?>

여기서 당신은 어떤 문제에 직면하지 않을 것입니다

3.와 헤더 기능을 사용 ob_start()하고ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>


답변

이 답변의 대부분은 매우 중요한 단계를 잊고 있습니다 !

header("Location: myOtherPage.php");
die();

중요한 두 번째 줄을 남겨두면 The Daily WTF가 끝날 것입니다 . 문제는 브라우저가 없다는 것입니다 페이지의 반환, 그래서 헤더가 무시로, 페이지의 나머지 부분이 리디렉션없이 실행됩니다 헤더를 존중.


답변

사용하다:

<?php header('Location: another-php-file.php'); exit(); ?>

또는 이미 PHP 태그를 연 경우 다음을 사용하십시오.

header('Location: another-php-file.php'); exit();

다음과 같은 외부 페이지로 리디렉션 할 수도 있습니다.

header('Location: https://www.google.com'); exit();

포함 exit()또는 포함 해야합니다 die().