2012-01-09 23 views
1

我最近開始學習HTML和PHP。如果有人能指出我正確的方向,我將不勝感激:我製作了一個基本的網頁,其中包含基本身份驗證(以便輸入)。當用戶點擊取消按鈕時,我希望瀏覽器做一些事情!它所做的只是保持在它所在的頁面上(在用戶嘗試訪問我的頁面之前)。我想我希望它顯示401錯誤。要做到這一點的唯一方法就是在後面插入文字:當用戶點擊'取消'時顯示未經授權的頁面(html/php)

header('www-authenticate: basic'); 

我試過在.htaccess文件重定向401錯誤,但它似乎從來沒有出現401錯誤(儘管服務器訪問日誌說,有一個401錯誤)。當我使用.htaccess重定向我的404錯誤時,它工作。

這是我已經得到了驗證碼:

<?php 
$user = array('Michael' => 'Mike'); 
$pass = array('Michael' => 'fish'); 
$userSuccess = false; 
$passSuccess = false; 

if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW'])) 
{ 
    header('http/1.1 401 Unauthorized'); 
    header('www-authenticate: basic'); 
    exit; 
} 
else 
{ 
    foreach($user as $value) 
     if($_SERVER['PHP_AUTH_USER'] == $value) 
      $userSuccess = true; 
    foreach($pass as $value) 
     if($_SERVER['PHP_AUTH_PW'] == $value) 
      $passSuccess = true; 

    if(!$userSuccess || !$passSuccess) 
    { 
     header('http/1.1 401 Unauthorized'); 
     header('www-authenticate: basic'); 
     exit; 
    } 
} 
?> 

而且,如果我做任何愚蠢的事在我的代碼,隨時指出來。

我想,既然我把401頭到服務器,並登錄到服務器收到它,它會一直顯示一些文本說,「錯誤401:未經授權訪問」或類似的規定。

謝謝。

回答

1

您需要爲瀏覽器與這不是自動完成的內容401。您發送的401頭永遠不會被用戶真正看到。把它看作是一個狀態標誌而不是內容。程序使用該頭來檢測某些問題並對其採取行動(即,下載管理器可能會檢測到404頭,然後在其窗口中顯示帶有紅色背景和錯誤符號的下載行)。

總之,你還是需要打印錯誤到瀏覽器自己

+0

謝謝您的回覆。它大多是有道理的。我很好奇,如果我在我的網頁中創建鏈接到另一個不存在的頁面或文件,它會返回未找到該頁面或未找到該文件。我沒有告訴它返回這個。爲什麼呢,如果找不到東西,它會告訴用戶;但是,如果用戶的身份驗證失敗,它不會告訴用戶? 再次感謝您的回覆。 – 2012-01-09 11:14:11

+0

當您收到404錯誤頁面時,apache(或您正在使用的任何http web服務器)是設置404標題狀態並輸出錯誤頁面內容的頁面。您甚至可以通過編輯錯誤文檔的html或創建新的錯誤文檔並告訴apache(例如通過htaccess)將新腳本用作404內容頁面 – Lee 2012-01-09 11:30:07

+0

來更改錯誤內容。也許我誤解了。它是通過一些默認的內置東西創建404錯誤頁面本身的Apache?人們會認爲它會在收到401狀態碼時做同樣的事情。 – 2012-01-09 12:17:23

1

你以正確的方式去。進一步信息Multidimensional Arrays

Array 
(
    [Mike] => Array 
     (
      [0] => Michael 
      [1] => fish 
     ) 

) 

閱讀:我會做的一些改變您的代碼:

所有的
$user = array('Mike' => array('Michael', 'fish')); 

if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW'])) 
{ 
    header('http/1.1 401 Unauthorized'); 
    header('www-authenticate: basic'); 
    exit; 
} 
else 
{ 
    $input_user = $_SERVER['PHP_AUTH_USER']; 
    $input_pw = $_SERVER['PHP_AUTH_PW']; 

    if($user[$input_user][1] != $input_pw) 
    { 
     header('http/1.1 401 Unauthorized'); 
     header('www-authenticate: basic'); 
     exit; 
    } 
} 

echo "Hi, " . $user[$input_user][0]; 

首先我對這個佈局更改您的users陣列布局於此。

Secund,是你的username,那麼它將有另一個陣列namepassword的用戶。所以你不需要用戶foreach來匹配你的用戶名和密碼。順便說一句,你的腳本將允許任何用戶訪問其他用戶通行證之前完成的方式。如果您有其他用戶foo並嘗試user = foopass = fish它將獲得訪問權限。

第三件事是,你並不需要使用$userSuccess$passSuccess沒有更多的。只是爲了減少代碼長度。

然後我用兩個瓦爾到_SERVER增值經銷商,關聯,使他們容易使用。所以你可以用這句話匹配:$user[$input_user][1] != $input_pw

我希望這可以幫助你。

+0

謝謝。我通過製作其他多維數據來擺脫其中一個數組。不過,我想,當我將另一個用戶添加到數組中時,我至少需要$ userSuccess。 – 2012-01-09 11:03:54

+0

如果你願意,你可以使用,但確實沒有必要,但如果你更喜歡它的話。 – 2012-01-09 11:13:39

相關問題