PHPを使用してユーザーを別のページにリダイレクトすることは可能ですか?
ユーザーがwww.example.com/page.php
にアクセスし、それらをwww.example.com/index.php
にリダイレクトしたいとします。メタリフレッシュを使用せずにどのようにしますか。出来ますか?
これは私のページを無許可のユーザーからさえ保護することができます。
既存の回答と私自身の2セントの要約:
header()
関数を使用して新しいHTTPヘッダーを送信できますが、これはHTMLまたはテキストの前(つまり、<!DOCTYPE ...>
宣言の前など)にブラウザに送信する必要があります。
header('Location: '.$newURL);
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ユーザエージェントである。そしてロボット。
HTTPヘッダとPHPのheader()
関数
あなたは PECL package pecl をインストールする必要があるhttp_redirect($url);
の代わりの方法を使うことができます。
この関数は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();
}
header()
は先に述べたように、何かが書き出される前にのみ機能します。 inmidst HTML _を出力すると通常失敗します。その場合は、次のようなHTMLヘッダーの回避策を使用します(あまり専門的ではありません)。
<meta http-equiv="refresh" content="0;url=finalpage.html">
JavaScriptのリダイレクトも可能です。
window.location.replace("http://example.com/");
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()
は、実際の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でそれをすることはできません。それは面倒すぎるかもしれません。ヘッダーがページから送信される最初のものであることを忘れないでください。ほとんどのリダイレクトは通常、ページの後半で必要になります。そのためには、ページのすべての出力をバッファリングし、後でリダイレクト状態を確認する必要があります。その時点でページのuser header()をリダイレクトするか、単にバッファリングされた出力をエコーすることができます。
バッファリングについて(利点)
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
?>
これらの答えのほとんどは very という重要なステップを忘れています。
header("Location: myOtherPage.php");
die();
その重要な2行目を去ることはあなたが The Daily WTF に行き着くのを見るかもしれません。問題はブラウザがあなたのページが返すヘッダを尊重するためにhaveしないことです。ヘッダが無視されると、ページの残りはリダイレクトなしで実行されます。
つかいます:
<?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()
を含めてください。
これらの答えの多くは正しいものですが、絶対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
セッション変数を使用してページへのアクセスを制御し、有効なユーザーを承認することもできます。
<?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アドレスとユーザーセッションのログアクセスをテキストファイルに追加しました。
私はすでにこの質問に答えていますが、その間に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リダイレクトコード(301
、302
、303
、および307
)のサポートの問題も処理しました。説明は次のとおりです。
header( 'Location: http://www.yoursite.com/new_page.html' );
header("Location: /index.php");
exit(0);
あなたは以下のようないくつかのJavaScriptメソッドを使うことができます
self.location="http://www.example.com/index.php";
window.location.href="http://www.example.com/index.php";
document.location.href = 'http://www.example.com/index.php';
window.location.replace("http://www.example.com/index.php");
つかいます:
<?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.
?>
訪問者を別のページにリダイレクトするには(特に条件付きループで便利)、次のコードを使用します。
<?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();
?>
これが私の考えです:
私見、着信要求をリダイレクトする最良の方法は、次のようになるロケーションヘッダーを使用することです。
<?php
header("Location: /index.php");
?>
この文が実行され、出力が送信されると、ブラウザはユーザへのリダイレクトを開始します。ただし、ヘッダを送信する前に出力(echo/var_dump)がないことを確認してください。そうしないとエラーが発生します。
これは元々求められていたことを達成するための手っ取り早い方法ですが、この種のリダイレクトは常に301/302リダイレクトとして解釈されるため、最終的にはSEOの問題になります。ランディングページやメインページではなく、リダイレクトされたページとしてのインデックスページ。
したがって、それはウェブサイトのSEO設定に影響します。
ここで他の人が言ったように、ロケーションヘッダを次のように送信します。
header( "Location: http://www.mywebsite.com/otherpage.php" );
しかし、他の出力をブラウザに送信する前にそれを行う必要があります。
また、あなたが言ったように、これを使って認証されていないユーザを特定のページからブロックするつもりなら、いくつかのユーザエージェント はこれを無視します 送信した後にdie()する必要があります。
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)にリダイレクトしません。
このコードを使用して、あるページから別のページにリダイレクトできます。
header("Location: index.php");
または、phpでJavaScriptを使用してリダイレクトしようとしている場合は、リダイレクトにscriptタグを使用してください。
echo "<script>window.open('your path where you redirect ','_self')</script>";
はい、PHPを使うことは可能です。別のページにリダイレクトします。
次のコードを試してください。
<?php
header("location:./"); // Redirect to index file
header("location:index.php"); // Redirect to index file
header("location:example.php");
?>
リダイレクトのためにこのコードを使う
header("Location: http://www.example.com/blog");
それには2つの方法があります。
ユーザーが 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 に保存します。
いずれかの条件が当てはまる場合は、他のページにリダイレクトします。
<?php
$myVar = "bskud";
if ($myVar == "bskud") {
?>
<script> window.location.href="https://bskud.com"; </script>
<?php
}
else {
echo "<b>Check the website name again</b>";
}
?>
リダイレクトする方法は2つあります。
PHP を使用する
<?php
header("Location: http://example.com/page.php");
die();
?>
Jqueryを使う
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>";
?>
つかいます:
<?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();
Apache上で実行している場合は、リダイレクトに.htaccessを使用することもできます。
Redirect 301 / http://new-site.com/
これを行う方法は複数ありますが、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”);
. . .
参考文献
より良いリダイレクトのためにこのコードを使う:
$ref="http://www.example.com';
echo '<script>window.location = "'.$ref.'";</script>';
exit;