web-dev-qa-db-ja.com

PHPヘッダーリダイレクトが機能しない

私はこれが以前にカバーされたことを知っていますが、これに対する答えを見つけることができません、

私はいつもこれを使ってきました。

header("Location: http://www.website.com/");
exit();

これは私の現在のプロジェクトでは常に機能していましたが、突然、どのブラウザでも機能しなくなりました

使用する代わりに、問題を特定して修正したい

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

エラーレポートも有効にしていますが、エラーは表示されません

// SET ERROR REPORTING
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
ini_set('display_errors', TRUE);

なぜそれが機能しないのか?

10
JasonDavis

試してみてください:

error_reporting(E_ALL | E_WARNING | E_NOTICE);
ini_set('display_errors', TRUE);


flush();
header("Location: http://www.website.com/");
die('should have redirected by now');

あなたが得るものを見てください。 error_reporting()呼び出しで^(xor)を使用しないでください。これは、通知と警告を除くすべてのエラーを意図せずに要求しているためです。これは、「ヘッダーが既に送信された」エラーです。

編集:

また、header()呼び出しのすぐ上にflush()を配置してみてください。

21
Mike B

場所とhttpの最初のhの間のスペースを削除してみてください。

header("Location: http://www.website.com/");
exit();

になる

header("Location:http://www.website.com/");
exit();

WAMPサーバーでこの問題が発生しました。

問題ではないはずですが、それがPHPのドキュメントに記載されている方法であることを考えると、とにかく試してみるべきです。多くの場合、うまくいったことはわかっています。 。

14
Tyler Carter

一般的な問題:

1)header(.......);コマンドの前に出力(つまり、_echo.._またはHTMLコード)があってはなりません。

2) _<?php_の前と_?>_タグの後に空白(または改行)があってはなりません。

GOLDER RULE!-ファイル(およびその他のinclude()- dファイル)にはBOMなしのUTF8エンコーディング( TF-8)だけではありません。これは多くの場合問題です(通常のTF8エンコードされたファイルには、ファイル出力の開始時に特殊文字が含まれているため)!!!!!!!!!!!

4)リダイレクトの場合、header(...);の後に_exit;_を使用する必要があります

5)推奨される方法-常に301または302を参照して使用してください。

_header("location: http://example.com",  true,  301 );  exit;
_

6)上記のいずれも役に立たない場合は、JAVSCRIPTリダイレクトを使用します(ただし、Googleでは強くお勧めしません)が、最後のチャンスかもしれません...:

_echo "<script type='text/javascript'>window.top.location='http://example.com/';</script>"; exit;
_
13
T.Todua

これを試して。私のために働いた。

echo "<meta http-equiv='refresh' content='0;url=http://www.yoursite.com'>";

4
karto

奇妙な解決策かもしれませんが、これを試して、ページエンコーディングをutf8からANSIに変更すると機能します。

任意のテキストエディタを使用して、ページをANSIエンコーディングとして保存し、オンラインサーバーにアップロードします。

1
Mahmoud Salem

Ob_start()を追加すると、この問題が解決しました。

1
Gayathri

また、ヘッダー関数を使用している場合は、テキスト(スペースも含む)がクライアントに書き込まれる前に最初に呼び出される必要があるため、呼び出しの前であっても、呼び出しの前にスペースが出力されていないことを再度確認してください。

<?php
1
Toby Allen

これを試してください(私のために働いています):

echo '<script>window.location.replace("http://www.example.com")</script>';

の代わりに

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

0
Umair Sultan

私は実際にこれに似たケースがあり、他のすべてのページの上部に管理ページが含まれていました。線の下の各ページの上部:

<?php include '../../admin.php' ?>

私はphpロジックを持っているでしょう:

<?php if($_SESSION['username'] === null){ header("Location: ./adminLogin.php");}?>

これに伴う問題は、どこか別の場所でheader(...を呼び出し/操作していたことでした。私のコードを何度も調べた後、問題がどこにあるのか理解できなかったことを認めます。次に、これらの各ファイルが他の処理を行う前にadmin.phpファイルにヒットすると思いました。そこで、各ビューの上部にあるロジックをadmin.phpファイルに配置するとどうなるかを考えました(ログインしない限り何も表示したくないため)。

何が起こったのかというと、私のビューのphp/htmlに到達する前に、誰かがログインしているかどうかを評価し($_SESSION['username']))、それがNULLの場合は、 adminLoginページ。このロジックをスイッチの直前に配置すると、かつてロジックが必要だったすべてのファイルで完全に機能しました。私がそれを開発で機能させた方法ですが、本番環境で多くの問題を引き起こしました。リダイレクトロジックをadmin.phpファイルに移動すると、重複するheader(...操作が回避されるだけでなく、ビューファイルからadmin.phpに余分なロジックが削除されるため、コードがより効率的になることがわかりました。ファイル。

すべてのビューファイルにロジックを配置するのではなく、スイッチの前に一度コントローラーに配置します。チャームのように機能します!これは、ログインしない限り、機密性の高いビューに誰もアクセスしたくない場合に役立ちます。私の場合、これはCMSにとって重要でした。ただし、ログインせずに表示したいファイルがある場合は、元のロジックで十分だと思います。すでに解決策を見つけたようですが、このエラーが再び発生した場合に役立つことを願っています。 :)

0
M.C.

インデックスページがhtmlファイルの場合、機能しない可能性があります。 index.phpに変更し、次のコードを使用します。

<?php

header("Location: http://ea.tc");

?>
0
Emre AYDIN

このページにアクセスすると、正確にはどうなりますか? FirebugまたはHTTPヘッダーを分析し、リダイレクトが実際に発生するかどうか、およびLocationヘッダーが実際に存在するかどうかを確認できるその他のツールを試すことができます。

0
Adam Byrtek

また、有効な場所にリダイレクトしていること、およびその場所に適切な404および500エラーメッセージ/ページが設定されていることを確認する必要があります。単に悪い場所をリダイレクトしている可能性があります。

0
arbales

奇妙ですが、phpで空白行を削除するとうまくいきました:-\

前のコード:

<?php

header("Location: http://www.website.com/");

?>

機能したコード:

<?php header("Location: http://www.website.com/"); ?>
0
lucorp