2012-01-07 19 views
2

私は最近、PHPの学習を始めました。私は基本的なウェブサイトを作って、基本的にそれをパスワードにしたかった。なぜこれがうまくいかないのか誰かが私に言うことができるなら、私はそれを感謝します。私はそれを試したので動作しないことを知っています。なぜか分からない。PHP認証(初心者)

<?php 
$user='user'; 
$pass='pass'; 

header('HTTP/1.1 401 Unauthorized'); 
header('WWW-Authenticate: Basic realm='.'hello'); 
if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass) 
    echo 'Authorized'; 
else 
    exit('Exiting'); 
?> 
... 
REST OF WEBSITE 
... 

私はそれを行うための「正しい」方法は、このようなものです知っている:誰かが、少なくとも正しい方向に私を指すことができれば、私はそれを感謝

<?php 
if(!isset($_SERVER['PHP_AUTH_USER'])) 
{ 
    header('HTTP/1.1 401 Unauthorized'); 
    header('WWW-Authenticate: Basic realm='.'hello'); 
    exit('Exiting'); 
} 
else 
{ 
    $user='user'; 
    $pass='pass'; 
    if($_SERVER['PHP_AUTH_USER']==$user && $_SERVER['PHP_AUTH_PW']==$pass) 
     echo 'Authorized'; 
    else 
    { 
     header('HTTP/1.1 401 Unauthorized'); 
     header('WWW-Authenticate: Basic realm='.'hello'); 
     exit('Exiting'); 
    } 
} 
?> 
REST OF WEBSITE 

。このライン使用

+1

また、 'PHP_AUTH_USER'と' _PW'は 'mod_php'設定のためにのみ存在し、F/CGI設定には存在しません。 – mario

答えて

3

HTTP認証を使用する場合、スクリプトは2回実行されます。最初は$_SERVER['PHP_AUTH_USER']が設定されていないため、ページに認証が必要であることをブラウザに通知する必要があります。次に、ブラウザにはページがリロードされますが、今回は$_SERVER['PHP_AUTH_USER']にユーザ名が含まれ、$_SERVER['PHP_AUTH_PW']にはユーザが入力したパスワードが含まれています。これが正しい資格情報($userおよび$pass)と一致する場合は、ページをブラウザに送信するように進みます。

あなたのコードはこれらの2つのケースを区別しないため、正しい資格情報がすでに送信されている場合でも、ユーザー名とパスワードが必要であることをブラウザに通知します。

+0

あなたの返事をありがとう。私はスクリプトが2回実行されたことには全く関心がありませんでした。それは、ユーザー資格情報を格納しているかのように、その後、自身を終了して再実行します。 –

+0

これは常に完全に実行されますが、ブラウザはページを表示せず、代わりにログインボックスを表示します。 – hakre

+0

私はそれがこの行になると仮定します: "header( 'WWW-Authenticate:Basic realm ='。 'hello');"その後、ユーザーが[OK]をクリックすると、リフレッシュされ、最初から再実行されます。ユーザーがキャンセルをクリックすると、そのまま正常に進みます。 –

3

header('HTTP/1.1 401 Unauthorized'); 

は、要求が失敗したことを、ブラウザを教えてくれます。要求ごとに使用するたびに、すべての要求は失敗します。

これは、2番目の例では必ずしも実行されるわけではなく、条件付きでのみ実行されるからです。

私は少しdemo exampleを作成しました。ブラウザのログインボックスが表示されます。ログインボックスを表示しないようにするには、好きなものを入力してからキャンセルを押します。

PHPスクリプトに提供されるデータが表示されます。

+0

あなたの説明は本当に私には意味がありません。デモの例を 'problem'行( "header( 'HTTP/1.1 401 Unauthorized');")なしで実行すると、まったく同じことがわかります! Frxstremの反応が理にかなっています。 –

+0

おそらく、問題が何であるかを具体的に伝える必要があります。デモサンプルコードが表示されている場合は、2行のヘッダー行があります。 – hakre

+0

私はそれを読んでいます。問題は、私の下の男が書いたことだと思う。それは少なくとも私には意味がある。 –