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


1262

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

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

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


PHP에서 헤더를 업데이트 할 수 있습니다 : header
Zack Marrapese

11
@ Sam : 사이드 노드와 마찬가지로protection from unauthorized users 비아 리디렉션을 구현 하지 마십시오 . 이것은 일이 어떻게 이루어져야 하는가가 아니다;)
Strae

7
@Strae 리디렉션으로 페이지를 보호하는 데 문제가 있습니까? 그렇다면 가장 좋은 방법은 무엇입니까?

6
@PravindaAmarathunga 리디렉션은 요소 중 하나이지만 유일한 요소는 아닙니다. 권한이없는 사용자에 대해 보호 된 요소가 전혀 출력되지 않도록하십시오. 브라우저의 리디렉션은 클라이언트 측에서 비활성화 할 수 있습니다. 예를 들어, 브라우저가 리디렉션을 수행하지 않고 원래 페이지가 정상적으로 출력되면 사용자에게 어떤 내용이 표시됩니까? CMS는 일반적으로 리디렉션 할 예방 메시지와 함께 정상 출력을 대체 보호 항목에서 나던 인쇄.
Strae

@PravindaAmarathunga는 markus의 답변에서 링크를 확인하십시오 : thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

답변:


1697

기존 답변과 내 자신의 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/");

5
이 답변의 일부 문제 : 303은 "올바른"상태 코드가 아닐 수 있습니다. 301은 예를 들어 구글에 바람직 할 수있다. 둘째, header('Location: '.$newURL);HTML (또는 텍스트)이 브라우저로 전달되기 전에 있어야합니다. 그렇지 않으면 제대로 작동하지 않습니다.
Chuck Le Butt

6
매일 WTF 이야기는 슬프게도 일반적인 이야기입니다. 어쨌든, 문제를 일으키는 것은 빠진 주사위가 아니라 나쁜 디자인입니다. 99.9 %의 경우 프로세스를 심하게 종료하는 것이 잘못되었습니다. 일반적으로 더 깨끗한 솔루션 (어쨌든 내가 좋아하는 것은 아님)은 RedirectionException을 발생시켜 응용 프로그램 진입 점에서 잡는 것입니다. 그 후에는 모든 "after *"통화를 할 수 있습니다 (로그 / 연결 끊기 / 무엇보다)
robertodecurnex

4
http-equiv="Location"모든 브라우저에서 지원되지 않습니다. refresh대신 사용해야 합니다! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002

71
당신이 그것을 의미 하지 않는 한 301을 발행 하지 마십시오 . 301 개 영구적 인 수단, 영구적 인 수단 영구은 , 그것은 긴 의미, 사용자 에이전트에 의해 캐시됩니다 의미 일부 페이지가 호출 또는 업데이트하고 맹세되어 있어야 맹세 때문에 미친 거 야 궁금 응용 프로그램 로그를보고 카페인 가득한 밤 신에게 그것은 당신의 기계에서는 작동하지만 클라이언트의 것은 작동하지 않습니다. 301을 반드시 호출해야하는 경우, 자원에 캐시 제어 최대 수명을 설정하십시오. 당신은 무한한 지혜를 가지고 있지 않으며 당신처럼 행동해서는 안됩니다.
madumlao

2
그러나 다이 오버 엑시트를 사용하는 이유가 있습니까? 출구가 더 깨끗하고 더 적절 해 보입니다.
ars265

122

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 실행이 중지되지 않습니다.


8
die () 또는 exit ()는 "Location : ..."헤더를 존중하지 않는 클라이언트를위한 것입니다.
clawr

12
@clawr : 아니요, exit()페이지에 나머지 내용이 표시되지 않도록합니다 (제한된 페이지 생각). vartec은 옳 습니다. HTTP Location 헤더 와 관련이 없으며 할 필요가 없습니다 exit. 간단한 리디렉션 을 수행하는 방법을 모르는 사람 은 간단하지만 중요한 단계를 구현하지 않고 안전한 프로세스 를 수행하여 고급 프로세스를 활용할 수 있기 때문에 대답에 포함하기로 선택했습니다. 제어.
Alix Axel

1
그러나 헤더를 존중하는 브라우저는 스크립트가 여전히 실행되는 동안 페이지를 떠나 연결을 닫습니다. 이것은 완전히 나쁘다. PHP는 일정 시간 동안 스크립트를 계속 사용하지만 (그래서 코드가 실행되는 이유) 실행 도중 무작위로 중단되어 문제가 발생할 수 있습니다. ignore_user_abort ()를 호출하면 이것을 막을 수 있지만 진심으로 가치가 없습니다. HTML 쓰기 작업을 계속 진행하지만 (아마도 쓸모는 없지만) 헤더 다음에 디스크 나 데이터베이스에 쓰는 작업은 수행하지 마십시오 ( 'Location :'); 가능한 경우 리디렉션 전에 디스크에 기록하십시오. [또한 : URL은 절대적이어야합니다.]
FrancescoMM

브라우저가 HTTP 프로토콜을 감지하기 전에 리디렉션하는 방법이 있습니까? 리디렉션해야하는 이유는 모든 도메인에 대해 충분한 SSL 인증서를 얻을 수 없기 때문입니다. 내가 사용하는 거라고 .htaccess리디렉션,하지만 난 어떻게 든 최종 도메인으로 리디렉션 도메인을 전달하는 방법이 필요합니다?
oldboy

109
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 ()를 잊지 마십시오!


6
출력 버퍼링을 잊지 마십시오. 그렇지 않으면 'Header already sent'가 표시됩니다.
Kuroki Kaze

8
... "$ n 초 안에 $ nepage로 리디렉션 될 것입니다. 리디렉션이 발생하지 않으면 $ link를 클릭하십시오"와 같은 somthign을 출력하는 것을 잊지 마십시오. 일부 브라우저와 일부 브라우저 설정은 해당 리디렉션에 실패 할 수 있습니다.
Strae

3
@DaNieL :이 유형의 리디렉션에는 "$ n 초"가 걸리지 않습니다. 전혀 발생하지 않으면 즉시 처리되며 적합한 브라우저가 처리해야합니다. 사람들이 더 잘 모르는 경우 사용하는 "메타 새로 고침"리디렉션을 생각하고 있다고 생각합니다.
rmeador

1
@rmeador ... 구형 브라우저 및 특수 브라우저 용. 실패한 경우 메타 리디렉션이 실패 할 경우 링크가 포함 된 "x 초 내에 페이지로 리디렉션됩니다"라는 메타 리디렉션이있는 경우 먼저 Location 헤더를 수행해야합니다. 이것이 리디렉션을 수행하는 올 바르고 안전한 방법입니다.
Andrew Moore

3
Andrew : HTTP 브라우저는 어떻게 Location :을 존중하지 않습니까?
vartec

102

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

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

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

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

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


2
간단하고 포인트 답변! 간단한 페이지 리디렉션에 좋습니다!
Stathis Andronikos

그렇게하면 일반적인 Cannot modify header information - headers already sent by오류가 발생 하지 않습니다 .
Kai Noack

1
@hmd, 자바 스크립트를 비활성화하면 어떻게됩니까?
Istiaque Ahmed

@IstiaqueAhmed javascript는 요즘 거의 항상 활성화되어 있지만 비활성화되어 있으면 PHP 버퍼를 사용할 수 있습니다. 이 SO 질문은 그에 대한 답변입니다. PHP 버퍼링을 사용하고 있다면이 방법이 필요하지 않습니다.
Hammad Khan

거짓으로, 버퍼링 없이도 PHP로 할 수 있습니다. 잘 디자인 된 페이지에서 HTML 컨텐츠가 사용자에게 전송되기 전에 모든 관련 PHP 처리가 이루어져야합니다. 그렇게하면 PHP 리디렉션이 제대로 작동합니다.
MestreLion

91

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
?>

매력처럼 작동합니다. <? php echo "<script> location.href = ' google.fr /' ; </script >"; ?> 그것을 테스트하기 위해, 그리고 내가 원하는 것을했습니다
DoctorDroid Haiti

1
두 번째 솔루션은 JS가 비활성화 된 상태에서는 작동하지 않습니다.
Tajni

55

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

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

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


1
스크립트를 종료하기 전에 사용자에게 출력을 제공하는 것은 어떻습니까? 알다시피, 사람들은 무슨 일이 일어나고 있는지 알고 싶어합니다.
Strae

3
스크립트가 리디렉션 이외의 작업을 수행하지 않는다고 가정합니다. 전혀 사실이 아닐 수도 있습니다.
vartec

13
@DaNieL : die ( "내 헤더 무시하지 마세요!")로 변경
nickf

3
나는 die();당신에 대한 간단한 설명이 마음에 들었습니다. 당신이 그것을하지 않으면 그것을 사용하면 사용자는 잠시 동안 전체 페이지를 볼 수 있습니다. 사용자는 리디렉션되며 더 일시적인 콘텐츠 글리치는 1 + 표시되지 않습니다
TheBlackBenzKid

헤더가 전송 된 후 유용한 활동이 발생할 수 있습니다. 활동은 브라우저로 아무것도 보내지 않지만 활동을 기록하거나 트랜잭션 기록을 완료합니다. 이러한 이유로, 다이 / 종료의 필요성은 스크립트에 따라 다릅니다.
DanAllen

28

사용하다:

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


25

세션 변수를 사용하여 페이지에 대한 액세스를 제어하고 유효한 사용자에게 권한을 부여 할 수도 있습니다.

<?php
    session_start();

    if (!isset( $_SESSION["valid_user"]))
    {
        header("location:../");
        exit();
    }

    // Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php .

최근에 사이버 공격을 받아 관리자 패널에 액세스하거나 웹 응용 프로그램의 일부에 액세스하려는 사용자를 알아야했습니다.

따라서 데이터베이스를 귀찮게하고 싶지 않기 때문에 텍스트 파일에 IP 주소 및 사용자 세션에 대한 로그 액세스를 추가했습니다.


19

이러한 답변은 대부분 정확하지만 절대 URL이 있다고 가정합니다. 그렇지 않을 수도 있습니다. 상대 URL 을 사용 하고 나머지를 생성하려면 다음과 같이 할 수 있습니다 ...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302

16

header( 'Location: http://www.yoursite.com/new_page.html' );


브라우저가 HTTP 프로토콜을 감지하기 전에 리디렉션하는 방법이 있습니까? 리디렉션해야하는 이유는 모든 도메인에 대해 충분한 SSL 인증서를 얻을 수 없기 때문입니다. 내가 사용하는 거라고 .htaccess리디렉션,하지만 난 어떻게 든 최종 도메인으로 리디렉션 도메인을 전달하는 방법이 필요합니다?
oldboy

16

다음 코드를 사용하십시오.

header("Location: /index.php");
exit(0);   

14

이미이 질문에 대답했지만 CLI에서 실행 중 (리디렉션을 수행 할 수 없으므로해서는 안 됨 exit()) 또는 웹 서버가 PHP를 (F) CGI로 실행 ( Status올바로 리디렉션하려면 이전에 설정된 헤더가 필요합니다 ).

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // If using sessions
            {
                session_regenerate_id(true); // Avoids session fixation attacks
                session_write_close(); // Avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

나는 또한 다른 HTTP 리디렉션 코드를 지원하는 문제를 처리했습니다 ( 301, 302, 303307), 그것은 내 이전 대답의 코멘트에 언급 된대로. 설명은 다음과 같습니다.

  • 301- 영구적으로 이동
  • 302- 발견
  • 303- 기타 참조
  • 307- 임시 리디렉션 (HTTP / 1.1)

11

방문자를 다른 페이지로 리디렉션하려면 (조건부 루프에 특히 유용) 다음 코드를 사용하십시오.

<?php
    header('Location: mypage.php');
?>

이 경우 mypage.php방문자를 리디렉션하려는 페이지의 주소입니다. 이 주소는 절대적 일 수 있으며 다음 형식의 매개 변수를 포함 할 수도 있습니다.mypage.php?param1=val1&m2=val2)

상대 / 절대 경로

상대 또는 절대 경로를 처리 할 때는 서버 루트 (DOCUMENT_ROOT)에서 절대 경로를 선택하는 것이 이상적입니다. 다음 형식을 사용하십시오.

<?php
    header('Location: /directory/mypage.php');
?>

대상 페이지가 다른 서버에있는 경우 전체 URL을 포함하십시오.

<?php
    header('Location: http://www.ccm.net/forum/');
?>

HTTP 헤더

HTTP 프로토콜에 따르면 HTTP 헤더는 before모든 유형의 컨텐츠 로 전송되어야합니다 . 이것은 빈칸이 아니라 헤더 앞에 문자를 보내지 않아야한다는 것을 의미합니다.

임시 / 영구 리디렉션

기본적으로 위에 제시된 재 지정 유형은 임시 유형입니다. 즉, Google 검색과 같은 검색 엔진은 색인 생성시 리디렉션을 고려하지 않습니다.

페이지가 다른 위치로 영구적으로 이동되었음을 검색 엔진에 알리려면 다음 코드를 사용하십시오.

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: new_address');
?>

예를 들어이 페이지에는 다음 코드가 있습니다.

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: /pc/imprimante.php3');
    exit();
?>

위의 링크를 클릭하면이 페이지로 자동 리디렉션됩니다. 또한 영구적으로 리디렉션됩니다 (상태 : 301 영구적으로 이동 됨). 따라서 첫 번째 URL을 Google에 입력하면 리디렉션 된 두 번째 링크로 자동 리디렉션됩니다.

PHP 코드 해석

방문자가 리디렉션에 지정된 주소로 이동하더라도 header () 뒤에있는 PHP 코드는 서버에서 해석됩니다. 대부분의 경우 서버의로드를 줄이려면 함수 의 header()기능 을 따르는 방법이 필요 exit()합니다.

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>

(두 번째 단락의 끝 근처에)? 당신은 의미합니까 &para(전체 읽기 때문에 대신 mypage.php?param1=val1&param2=val2))? (HTML 엔티티 para )는 "¶"입니다. 일부 외부 프로그램은 변환을 했습니까?
피터 Mortensen

9

사용하다:

<?php
    header('Location: redirectpage.php');
    header('Location: redirectpage.php');
    exit();
    echo "<script>location.href='redirectpage.php';</script>";
?>

이것은 일반적이고 정상적인 PHP 리디렉션이지만 아래 코드를 통해 몇 초 동안 리디렉션 페이지를 만들 수 있습니다.

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>

7

시맨틱 웹 전날, 정확성은 고려해야 할 사항입니다. 불행히도 PHP의 "Location"-헤더는 여전히 HTTP 302 리디렉션 코드를 사용하는데, 이는 리디렉션에 가장 적합하지 않습니다. 대신 사용해야하는 것은 303 입니다.

W3C는 303- 헤더가 현재 사용중인 브라우저가없는 "많은 pre-HTTP / 1.1 사용자 에이전트"와 호환되지 않는다는 것을 언급 할만큼 충분히 친절 합니다. 302는 유물입니다 해서는 안됩니다 .

또는 다른 사람들처럼 무시해도됩니다.


7

아래와 같은 JavaScript 메소드를 사용할 수 있습니다

  1. self.location="http://www.example.com/index.php";

  2. window.location.href="http://www.example.com/index.php";

  3. document.location.href = 'http://www.example.com/index.php';

  4. window.location.replace("http://www.example.com/index.php");


자바 스크립트는 클라이언트에서 실행되며 원하는 것이거나 아닐 수도 있습니다.
chharvey

7

예, header () 함수를 사용할 수 있습니다.

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();

또한 모범 사례는 함수 바로 다음에 exit () 함수 를 호출 header()하여 아래 코드 실행을 피하는 것입니다.

설명서에 따르면 header()실제 출력을 보내기 전에 호출해야합니다.


6

다른 사람들이 말했듯이 위치 헤더를 다음과 같이 보내십시오.

header( "Location: http://www.mywebsite.com/otherpage.php" );

그러나 다른 출력을 브라우저로 보내려면 먼저해야합니다.

또한이를 사용하여 언급 한 것처럼 특정 페이지에서 인증되지 않은 사용자를 차단하려는 경우 일부 사용자 에이전트 는이를 무시 하고 현재 페이지에서 계속 진행하므로 명심 해야합니다 ( ) 발송 후


but you need to do it before you've sent any other output to the browser. 대박!! 헤더를 계속 수신하는 이유를 몇 분 동안 검색하여 이미 오류를 보냈습니다. +1 !!
josh

더 일반적으로, 당신은 / 완전히 스크립트를 중지 / 있습니다. die()그렇게하는 한 가지 방법 일뿐입니다.
MauganRa

6

내 생각은 다음과 같습니다.

들어오는 요청을 리디렉션하는 가장 좋은 방법은 위치 헤더를 사용하는 것입니다.

<?php
    header("Location: /index.php");
?>

이 명령문이 실행되고 출력이 전송되면 브라우저가 사용자를 리디렉션하기 시작합니다. 그러나 헤더를 보내기 전에 출력 (에코 / var_dump)이 없는지 확인하십시오. 그렇지 않으면 오류가 발생합니다.

이것이 원래 요청 된 것을 달성하기위한 빠르고 더러운 방법이지만, 이런 종류의 리디렉션은 항상 301/302 리디렉션으로 해석되므로 검색 엔진은 항상 방문 페이지 / 메인 페이지가 아닌 리디렉션 페이지로 색인 페이지.

따라서 웹 사이트의 SEO 설정에 영향을 미칩니다.


1
exit ()는 header () 바로 다음에 사용해야합니다.
EKanadily

@docesam .. agree .. exit ()는 header () 호출 후 즉시 호출해야합니다. 그러나이 header () 문 이후에 브라우저에 더 이상의 출력이 없으면 exit ()가 필요하지 않을 수도 있습니다. 내 의견
Bhaskar Pramanik

그렇습니다. 누군가 코드를 자신의 스크립트에 복사 할 수 있고 잠재적으로 무엇이 잘못되었는지 알아내는 데 오랜 시간이 걸릴 수 있기 때문에 설명해야합니다.
EKanadily 2012

1
@BhaskarPramanik은 신속하게 문을 잠 가야한다고 생각하지만 문을 다시 잠 그거나 밀어서 이미 잠그지 않았는지 확인해야합니다.
aswzen

5

PHP로 리디렉션하는 가장 좋은 방법은 다음 코드입니다.

 header("Location: /index.php");

이후 코드가 작동하지 않는지 확인하십시오

header("Location: /index.php");

위 코드 전에 모든 코드를 실행해야합니다.

가정 해 봅시다.

사례 1 :

echo "I am a web developer";
header("Location: /index.php");

위치 (index.php)로 올바르게 리디렉션됩니다.

사례 2 :

return $something;
header("Location: /index.php");

위 코드는 위치 (index.php)로 리디렉션되지 않습니다.


귀하가 제공 한 정보와 더 많은 정보가 포함 된 1085 개의 답변이 이미 있습니다.
Patrick Hund

5

예, PHP를 사용할 수 있습니다. 다른 페이지로 리디렉션합니다.

다음 코드를 시도하십시오.

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>

4

1. header내장 PHP 함수를 사용하여

a) 매개 변수가없는 간단한 리디렉션

<?php
   header('Location: index.php');
?>

b) GET 매개 변수로 리디렉션

<?php
      $id = 2;
      header("Location: index.php?id=$id&msg=succesfully redirect");
  ?>

2. PHP에서 JavaScript로 리디렉션

a) 매개 변수가없는 간단한 리디렉션

<?php
     echo "<script>location.href='index.php';</script>";
 ?>

b) GET 매개 변수로 리디렉션

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>

자바 스크립트 비트는 사이트의 최종 호스팅에서 작동하는 유일한 방법이었습니다. 캐싱의 문제라고 생각하지만 즉시 해결했습니다.
cdsaenz

3

우리는 두 가지 방법으로 할 수 있습니다 :

  1. 사용자가 https://bskud.com/PINCODE/BIHAR/index.php에 오면 https://bskud.com/PINCODE/BIHAR.php 로 리디렉션 하십시오.

    아래 PHP 코드로

    <?php
        header("Location: https://bskud.com/PINCODE/BIHAR.php");
        exit;
    ?>

    위 코드를 https://bskud.com/PINCODE/BIHAR/index.php에 저장하십시오.

  2. 조건이 충족되면 다른 페이지로 리디렉션하십시오.

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>

이게 뭐야? 자신의 웹 사이트에 대한 링크를 사용하지 마십시오. 두 번째 예제는 PHP header()함수가 아닌 자바 스크립트 리디렉션을 사용 합니다.
Scriptman

2

사용하다:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>

1
코드의 기능을 설명해 주시겠습니까? 길이와 내용으로 인해 답변이 신고되었습니다.
www139

2

여러 가지 방법이 있지만 원하는 경우이 기능을 php사용하는 것이 좋습니다 header().

원래

$your_target_url = www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

한 단계 더 높이려면 기능에 사용하는 것이 가장 좋습니다. 이렇게하면 인증 및 기타 검사 요소를 추가 할 수 있습니다.

사용자의 레벨을 확인하여 시도해 봅시다.

따라서라는 세션에 사용자 권한 레벨을 저장했다고 가정하십시오 u_auth.

에서 function.php

<?php
    function authRedirect($get_auth_level,
                          $required_level,
                          $if_fail_link = www.example.com/index.php”){
        if ($get_auth_level != $required_level){
            header(location : $if_fail_link);
            return false;
            exit();
        }
        else{
            return true;
        }
     }

     . . .

그런 다음 인증하려는 모든 페이지에 대해 함수를 호출합니다.

page.php다른 페이지 에서처럼 .

<?php

    // page.php

    require function.php

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, www.someotherplace.com/somepage.php”);

    . . .

참고 문헌;



2

라우팅에 헤더 기능 사용

<?php
     header('Location: B.php');
     exit();
?>

또는 을 도와주는 것보다 A.php 파일에서 B.php 로 라우팅한다고 가정합니다 . 예를 보자<button><a>

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>

정확한 솔루션이나 좋은 솔루션을 제공 할 수 있습니까?
Mehedi Abdullah

이미 많은 솔루션이 있습니다. 귀하의 솔루션에는 PHP 태그없이 HTML과 PHP가 혼합되어 있습니다. 둘째, HTML 코드를 인쇄 한 후 헤더를 보내므로 작동하지 않습니다. 그리고 예제 파일의 이름이 잘못되었습니다. 이름을 A.php와 B.php로 지정해서는 안됩니다. 나는 그것이 단지 예일 뿐이라는 것을 알고 있지만 여전히 명명 규칙에 관심을 가져야합니다.
Tajni

1

Apache에서 실행중인 경우 리디렉션에 .htaccess를 사용할 수도 있습니다.

Redirect 301 / http://new-site.com/

1

PHP header함수 를 사용 하여 경로 재 지정을 시도 할 수 있습니다 . 브라우저가 화면에 리디렉션 경고를 표시하지 않도록 출력 버퍼를 설정하려고합니다.

ob_start();
header("Location: " . $website);
ob_end_flush();

1
exit ()는 header () 바로 다음에 사용해야합니다. 또한 아웃 버퍼링은 현재 기본적으로 자동으로 켜져 있습니다.
EKanadily 2012

0

이거 한번 해봐

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.