2009-08-09 6 views
4

ここで、コマンドheader()を使用しますか?PHPのヘッダを理解するには

私はハンドラ/ handle_login.phpに次のコードを書いています。ユーザーは開始場所であるindex.phpからサイトにアクセスしました。

if(!$logged_in){ 
    header("Location: index.php");                   
    die("You are not logged_in"); 
} 

かの句がtrueの場合、ヘッダーではなくindex.phpの、handlers/index.phpにに私を置くために、私は、404エラーが発生します。

+0

あなたのコードは、header()コールの前に他の出力を行いますか?もしそうなら、それを記述してください。 – fixmycode

+0

ありがとうございました! –

+0

私のテストでは、PHPはクライアントに送信される前に 'Location'ヘッダの値を変更するようには見えません。ブラウザは、現在のコンテキストを 'handlers /'に解釈しています。絶対にURIを動的に作成する方法を工夫していないので、あなたの環境にはまったく必要な素晴らしい「Location」ヘッダ変換があります。 – Zenexer

答えて

8

私はnilamoと伯爵に同意している間、私は大きな絵を与えることができることを望む:相対パスを使用して

はブラウザ は「考えて」場所に応じて、非常に奇妙な効果を持つことができますあなたのサイト階層にあります。たとえば、サイトにインデックスファイル '/index.php'があり、URIパスでモジュールとアクションを受け入れるように設定されているとします。以下のようなヘッダを返し、このような状況から、

http://www.yoursite.com/forms/contact/ 

:あなたは非常によくように見えるURLがあり

header("Location: index.php"); 

は非常によく要求しようとするために、ブラウザを引き起こす可能性があり

http://www.yoursite.com/forms/contact/index.php 

これは明らかにあなたが望むものではありません。このため、上記で推奨されているように '/index.php'を使用するか、可能な場合は完全修飾URLを使用する方が一般的に適しています。

これが役に立ちます。

+8

私は、HTTP/1.1 RFCが、ヘッダLocationで与えられたURLは、絶対でなく、相対的でなければならないことを明示的に述べているだけです: "フィールド値は単一の絶対URIで構成されています"(http://www.w3。 org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30)。ブラウザが一般的に相対URLで作業する場合でも、絶対URLを使用する必要があります –

1

は「/」を使用してみてください:

if(!$logged_in){ 
    header("Location: /index.php");                   
    die("You are not logged_in"); 
} 

スラッシュがなければ、あなたが現在のディレクトリに何かを参照していることが想定されます。スラッシュを前面に貼ることで、サイトのルートにあるファイルを明示的に参照していることになります。ページは 'index.php'なので、 "header( 'Location:/')"と同じように簡単に使うことができます。

+1

HTTP仕様では、ロケーションヘッダーが絶対URLである必要があるため、Downvotedです。あなたが親戚を使うなら、それは動くかもしれないし、動かないかもしれません。 –

4

ファイル名だけでなく、index.phpの完全なURLに場所を設定します。 php.netによると、これは正しい方法です。相対パスは使用しないでください。次に例を示します。

if(!$logged_in){ 
    header("Location: http://exampledomain.com/index.php"); 
    die("You are not logged_in"); 
} 
+0

オフラインでコードをデバッグしているため、このようなURLは使用できません。しかし、 'http:// localhost/index.php'のようなURLがあなたのURLと同じように動作するかどうかはわかりません。 –

+0

$ _SERVER ['SERVER_NAME']グローバル変数を使用できます。 – Phoexo