web-dev-qa-db-ja.com

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

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

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

これは私のページを無許可のユーザーからさえ保護することができます。

1130
Sam

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

基本的な答え

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のみが許可されていた古い{ RFC 2616 を置き換えた RFC 7231 を参照してください。

ステータスコード

PHPの "Location"ヘッダは依然として HTTP 302 -リダイレクトコードを使用しますが、これはあなたが使用すべきものではありません。あなたは 301 (恒久的なリダイレクト)か 303 (その他)のどちらかを考慮する必要があります。

注意: W3Cに言及 は303ヘッダは "多くのHTTP/1.1以前のユーザエージェントと互換性がない。現在使用されているブラウザは全てHTTP/1.1ユーザエージェントである。そしてロボット。

3.ドキュメンテーション

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

代替案

あなたは PECL package 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()は先に述べたように、何かが書き出される前にのみ機能します。 inmidst HTML _を出力すると通常失敗します。その場合は、次のようなHTMLヘッダーの回避策を使用します(あまり専門的ではありません)。

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

JavaScriptのリダイレクトも可能です。

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

header() function を使用して、 HTTP Location header を送信します。

header('Location: '.$newURL);

一部の人が考えていることとは反対に、die()はリダイレクトとは関係ありません。通常の実行をリダイレクトする場合はonlyを使用しますinstead

ファイルexample.php

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

3回の実行の結果:

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

108
vartec
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()を忘れないでください。

101
Alix Axel

Echoを使用してPHPからJavaScriptを出力します。

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

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

バッファリングについて(利点)

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

92
Hammad Khan

1. exit()でヘッダー関数を使用する

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

しかし、ヘッダ関数を使用する場合、ヘッダを送信する前にエコーや印刷を行わないという解決策として"header already sendのような警告"が表示されるか、単に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
?>
81
Juned Ansari

これらの答えのほとんどは very という重要なステップを忘れています。

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

その重要な2行目を去ることはあなたが The Daily WTF に行き着くのを見るかもしれません。問題はブラウザがあなたのページが返すヘッダを尊重するためにhaveしないことです。ヘッダが無視されると、ページの残りはリダイレクトなしで実行されます。

52
nickf

つかいます:

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

すでにPHPタグを開いている場合は、これを使用します。

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

以下のように外部ページにリダイレクトすることもできます。

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

必ずexit()またはinclude die()を含めてください。

23
jake

これらの答えの多くは正しいものですが、絶対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
18
Luke

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

<?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アドレスとユーザーセッションのログアクセスをテキストファイルに追加しました。

18
Asuquo12

私はすでにこの質問に答えていますが、その間にCLIで実行している場合(リダイレクトが発生しないためexit()ではない場合)、またはWebサーバーが異常な場合があることを知りました。 ([F)CGIとしてPHPを実行しています(正しくリダイレ​​クトするには、事前に設定された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リダイレクトコード(301302303、および307)のサポートの問題も処理しました。説明は次のとおりです。

  • 301 - 恒久的に移動した
  • 302 - 見つかった
  • 303 - 他を参照
  • 307 - 一時的なリダイレクト(HTTP/1.1)
13
Alix Axel

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

13
Daniel A. White
header("Location: /index.php");
exit(0);   
10
joan16v

あなたは以下のようないくつかの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");

8
Vikram Pote

はい、 header() 関数を使用できます。

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

また、ベストプラクティスは、以下のコード実行を回避するためにheader()関数の直後に exit() 関数を呼び出すことです。

ドキュメントによれば、実際の出力が送信される前にheader()を呼び出さなければなりません。

7
CasperSL

つかいます:

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

訪問者を別のページにリダイレクトするには(特に条件付きループで便利)、次のコードを使用します。

<?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 Moved Permanently)。そのため、最初のURLをGoogleに入力すると、自動的に2番目のリダイレクトされたリンクにリダイレクトされます。

PHPコードの解釈

Header()の後にあるPHPコードは、訪問者がリダイレクトで指定されたアドレスに移動したとしても、サーバーによって解釈されます。ほとんどの場合、これはサーバーの負荷を減らすためにheader()関数のexit()関数に従う方法が必要であることを意味します。

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

これが私の考えです:

私見、着信要求をリダイレクトする最良の方法は、次のようになるロケーションヘッダーを使用することです。

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

この文が実行され、出力が送信されると、ブラウザはユーザへのリダイレクトを開始します。ただし、ヘッダを送信する前に出力(echo/var_dump)がないことを確認してください。そうしないとエラーが発生します。

これは元々求められていたことを達成するための手っ取り早い方法ですが、この種のリダイレクトは常に301/302リダイレクトとして解釈されるため、最終的にはSEOの問題になります。ランディングページやメインページではなく、リダイレクトされたページとしてのインデックスページ。

したがって、それはウェブサイトのSEO設定に影響します。

6

セマンティックWebの前夜では、正確性を考慮する必要があります。残念ながら、PHPの「ロケーション」ヘッダーは、まだ HTTP 302 -redirectコードを使用しています。厳密には、リダイレクトには最適なコードではありません。代わりに使用する必要があるのは、 oneです。

W3Cは、 メンション に十分なほど親切であり、303ヘッダーは「HTTP/1.1以前の多くのユーザーエージェント」と互換性がなく、現在使用されているブラウザはありません。したがって、302は遺物であり、を使用すべきではありません

...または、他のみんなと同じように、それを無視することもできます...

6
Henrik Paul

ここで他の人が言ったように、ロケーションヘッダを次のように送信します。

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

しかし、他の出力をブラウザに送信する前にそれを行う必要があります。

また、あなたが言ったように、これを使って認証されていないユーザを特定のページからブロックするつもりなら、いくつかのユーザエージェント はこれを無視します 送信した後にdie()する必要があります。

6
Brent

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)にリダイレクトしません。

5
sabuz

このコードを使用して、あるページから別のページにリダイレクトできます。

header("Location: index.php");

または、phpでJavaScriptを使用してリダイレクトしようとしている場合は、リダイレクトにscriptタグを使用してください。

echo "<script>window.open('your path where you redirect ','_self')</script>";
5
Kashif

はい、PHPを使うことは可能です。別のページにリダイレクトします。

次のコードを試してください。

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

リダイレクトのためにこのコードを使う

header("Location: http://www.example.com/blog");
4
user8031209

それには2つの方法があります。

  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>";
        }
    ?>
    
3
Kavita Sharma

リダイレクトする方法は2つあります。

PHP を使用する

<?php 

header("Location: http://example.com/page.php");
die();
?>

Jqueryを使う

2
Javed Khan

1.組み込みPHP関数headerを使用する

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>";
   ?>
2
Shaan Ansari

つかいます:

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

リダイレクトを行うためにPHP header関数を使用することを試みることができます。ブラウザが画面にリダイレクトの警告を出さないように出力バッファを設定したいでしょう。

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

Apache上で実行している場合は、リダイレクトに.htaccessを使用することもできます。

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

これを行う方法は複数ありますが、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”);

    . . .

参考文献

1
Pyr James

より良いリダイレクトのためにこのコードを使う:

$ref="http://www.example.com';
echo '<script>window.location = "'.$ref.'";</script>';  
exit;
0
user8031209