[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()
.