PHPでリダイレクトするにはどうすればよいですか?

2009年04月20日に質問されました。  ·  閲覧回数 3M回  ·  ソース

Sam picture
2009年04月20日

PHPを使用してユーザーを別のページにリダイレクトすることは可能ですか?

ユーザーがwww.example.com/page.php 、それらをwww.example.com/index.phpにリダイレクトしたい場合、メタリフレッシュを使用せずにどのようにリダイレクトしますか? 出来ますか?

これにより、許可されていないユーザーからページを保護することもできます。

回答

markus picture
2009年04月20日
1754

既存の回答の要約と私自身の2セント:

1.基本的な答え

header()関数を使用して新しいHTTPヘッダーを送信できますが、これはHTMLまたはテキストの前に(たとえば、 <!DOCTYPE ...>宣言の前に)ブラウザーに送信する必要があります。

header('Location: '.$newURL);

2.重要な詳細

die()またはexit()

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

die()またはexit()を使用する理由: The Daily WTF

絶対URLまたは相対URL

2014年6月以降、絶対URLと相対URLの両方を使用できます。 絶対URLのみが許可されていた古いRFC2616を置き換えたRFC7231を参照してください。

ステータスコード

PHPの「Location」ヘッダーは引き続きHTTP302リダイレクトコードを使用します。これは「一時的な」リダイレクトであり、使用すべきものではない可能性があります。 301 (永続的なリダイレクト)または303 (その他)のいずれかを検討する必要があります。

注: W3Cは、303ヘッダーが「多くのHTTP /1.1以前のユーザーエージェント」と互換性がないと

3.ドキュメント

PHPのHTTPヘッダーとheader()関数

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出力の

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

またはJavaScriptリダイレクトも。

window.location.replace("http://example.com/");
vartec picture
2009年04月20日
126

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

3回の実行の結果:

[email protected]:~> 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()は、実際のP​​HPとは関係のない都市伝説です。 クライアントがLocation:ヘッダーを「尊重」することとは何の関係もありません。 ヘッダーを送信しても、使用するクライアントに関係なく、PHPの実行は停止しません。

Alix Axel picture
2009年04月20日
112
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()を忘れないでください!

Hammad Khan picture
2014年06月27日
104

仕事をするechoを使用してPHPからJavaScriptを出力します。

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

ページ出力をバッファリングし、後でリダイレクト条件を確認しない限り、PHPで実際にそれを行うことはできません。 それは面倒すぎるかもしれません。 ヘッダーはページから送信される最初のものであることを忘れないでください。 リダイレクトのほとんどは通常、ページの後半で必要になります。 そのためには、ページのすべての出力をバッファリングし、後でリダイレクト条件を確認する必要があります。 その時点で、ページユーザーheader()をリダイレクトするか、単にバッファリングされた出力をエコーすることができます。

バッファリングの詳細(利点)

出力バッファリングとは何ですか?

Juned Ansari picture
2017年04月13日
93

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
?>
nickf picture
2009年04月20日
55

これらの答えのほとんどは、非常に重要なステップを忘れています!

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

その重要な2行目を残しておくと、 The DailyWTFにたどり着く可能性があります。 問題は、ブラウザがページのリターンは、そのヘッダを無視していると、ページの残りの部分は、リダイレクトなしで実行されるヘッダを尊重する必要がないことです。

jake picture
2016年05月16日
30

使用する:

<?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()を含めるようにしてください。

Asuquo12 picture
2016年09月09日
25

セッション変数を使用して、ページへのアクセスを制御し、有効なユーザーを承認することもできます。

<?php
    session_start();

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

    // Page goes here
?>

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

最近、サイバー攻撃を受けて、管理パネルまたはWebアプリケーションの予約部分にアクセスしようとしているユーザーを知る必要があると判断しました。

そこで、データベースに煩わされたくないので、IPアドレスとユーザーセッションのログアクセスをテキストファイルに追加しました。

Luke picture
2014年01月15日
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
Daniel A. White picture
2009年04月20日
16

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