php
  • .htaccess
  • url
  • post
  • url-rewriting
  • 2017-04-27 54 views 0 likes 
    0

    我有一個頁面,我正在開發位於mysite.com/pagePHP發送POST數據重寫URL

    在這個頁面上,用戶可以輸入用戶名和密碼:

    <form method="post"> 
        <div class='form-group'> 
         <label for='username'>Username</label> 
         <input class='form-control' id='spreadsheet-form-username' name='username' placeholder='Username'> 
        </div> 
        <div class='form-group'> 
         <label for='password'>Password (optional - required to edit)</label> 
         <input type='password' class='form-control' name='password' id='spreadsheet-form-password' placeholder='Password'> 
        </div> 
        <button type='submit' class='btn btn-default'>Submit</button> 
    </form> 
    

    當用戶點擊提交,其職位數據和URL改寫爲mysite.com/page/exampleUsermysite.com/page?username=exampleUser

    相當於如果用戶只提交的用戶名來查找,我希望他們只能在mysite.com/page/exampleUser查看數據,如果他們提交一個正確的密碼,他們可以編輯數據。

    我可以得到正確的URL,但我在尋找如何檢查用戶名和密碼是否都在mysite.com/page/exampleUser頁面上發送(以及它們的值是什麼)而掙扎。我希望能夠判斷是否允許他們編輯該頁面上的數據。

    我試過這段代碼:

    $mode = "view"; 
    
    if (isset($_POST["password"])) { 
        if (hashOfPassword matches password submitted) { 
         $mode = "edit"; 
        } 
    } 
    if (isset($_POST["username"])) { 
        $username = $_POST["username"]; 
        header("Location: /spreadsheet/" . $username); 
    } 
    

    ,但我不能似乎能夠得到的$ _POST [「密碼」]的數據,而在重寫URL。它僅在URL被重寫之前可用。

    我不一定需要能夠發送密碼,但我希望能夠發送一些信息,讓我知道該頁面應該是可見的還是可編輯的。我也不能通過URL發送它(例如:mysite.com/page/exampleUser/edit),因爲我不希望用戶只需更改URL就能夠編輯其他用戶的數據。

    這裏是我如何處理URL重寫:

    // Trim leading slashes 
    $path = ltrim($_SERVER['REQUEST_URI'], '/'); 
    
    // Split url on slashes 
    $elements = explode('/', $path); 
    
    if ($elements[0] == "page" && sizeof($elements) == 1) { 
        // do nothing, there wasn't a username submitted  
    } 
    else { 
    
        switch(array_shift($elements)) 
        { 
         case 'page': 
          echo "username: " . $elements[1]; 
          echo "password: " /* not sure what to put here*/; 
          break; 
         default: 
          header("/404.php"); 
          break; 
        } 
    } 
    

    和我.htaccess

    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^([^\.]+)$ $1.php [NC] 
    
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ 404.php [L] 
    

    任何幫助,將不勝感激!

    +0

    你可以啓動一個'session',確認URL重寫之前的密碼,並給會話某種「授權」是那麼URL重寫後檢查的。 – Luke

    回答

    0

    您可以在會話中存儲密碼和某種標識符。在下面的例子中,我使用uniqid()來生成密鑰。您可以放心地將此ID放入重定向網址中。

    稍後,您可以檢查ID並使用存儲在會話中的密碼(如果相匹配)。

    // Remove if session is already started at this point 
    session_start(); 
    $mode = "view"; 
    
    if (isset($_POST["password"])) { 
        if (hashOfPassword matches password submitted) { 
         $mode = "edit"; 
        } 
    } 
    if (isset($_POST["username"])) { 
        $username = $_POST["username"]; 
    
        $passwordId = uniqid(); 
        $_SESSION['spreadsheetPasswordId'] = $passwordId; 
        // Password should be hashed before writing it to session. 
        $_SESSION['spreadsheetPassword'] = $_POST["password"]; 
    
        header("Location: /spreadsheet/" . $username . "/" . $passwordId); 
    } 
    

    後來

    // Remove if session is already started at this point 
    session_start(); 
    // Trim leading slashes 
    $path = ltrim($_SERVER['REQUEST_URI'], '/'); 
    
    // Split url on slashes 
    $elements = explode('/', $path); 
    
    // we need at least three elements 
    if ($elements[0] == "page" && sizeof($elements) < 3) { 
        // do nothing, there wasn't a username submitted  
    } 
    else { 
    
        switch(array_shift($elements)) 
        { 
         case 'page': 
          echo "username: " . $elements[1]; 
          echo "password: " . (
           $_SESSION['spreadsheetPasswordId'] == $elements[2] ? 
           $_SESSION['spreadsheetPassword'] : 
           'Access key is invalid or has expired.'); 
          break; 
         default: 
          header("/404.php"); 
          break; 
        } 
    } 
    
    相關問題