Php

表單的 PHP 處理頁面不符合其余文件的要求

  • May 4, 2021

我是一名網路開發愛好者。我已經 50 多歲了,從未從事過真正的 Web 開發工作,但喜歡在業餘時間修補樂趣。也就是說,我有一個由 Bluehost 託管的網站,是我用 PHP 從頭開始編寫的。我實際上比創建 UI 更喜歡這些功能。我不使用 CMS 或框架。

我的具體問題是:我嘗試遵循規範,因此我的根文件夾或 public_html 文件夾中有一個 .htaccess 文件。在這我只有一行FallbackResource index.php

我嘗試通過這樣的 index.php 文件處理我所有的“網站頁面”>

// check url in users browser and bring here
   $path = ltrim($_SERVER['REQUEST_URI'], '/'); // Trim leading slash(es)

   if($path === "" || $path === "login" || $path === "home"){
       if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true){
           require_once '../my_stuff/dashboard.php';            
       }else{  
           require_once '../my_stuff/login.php';
       }
   }elseif($path === "register"){
       if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true){
           require_once '../my_stuff/dashboard.php';            
       }else{  
           require_once '../my_stuff/register.php';
       }
   }elseif($path === "dashboard"){
       if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true){
           require_once '../my_stuff/dashboard.php';            
       }else{  
           require_once '../my_stuff/login.php';
       }
   }elseif($path === "logout"){
       require_once '../my_stuff/logout.php';
   }elseif($path === "verify"){
       require_once '../my_stuff/verify.php';
   }elseif($path === "proc_reg.php"){
       require_once 'proc_reg.php';
   }else{
       header('HTTP/1.1 404 Not Found');
       echo 'page not found';
   }

html 根目錄中的唯一文件是 index.php .htaccess 和我的 favicon.ico。所有其他文件都是從 html 根目錄之外的文件夾載入的。這工作正常。當我的 html 中有連結時,它們看起來就像“/about”或“/home”,它們也可以正常工作,重定向回 index.php。但是,我的所有表單處理頁面都沒有被正確訪問。我真的不喜歡將表單發回給自己,我喜歡單獨處理它。我喜歡保持關注點分離。對於我的 index.php 文件中的包含,我使用 ../my_stuff/whatever_page 來獲取我的其他文件,從 html 根目錄返回到 my_stuff 文件夾。但是當我在表單的“action”屬性中包含這些 URL 時,這不起作用。至少不在主機伺服器上。當我在本地開發時,它工作正常。所以,我不得不將表單處理文件從 html 根目錄上方的 my_stuff 中移出,並將它們放在 html 根目錄中的另一個文件夾中。我認為這很混亂並且有潛在的危險。我確實將此行添加到我的 .htaccess 文件中 >Options -Indexes有點幫助。但是,如果有人知道文件的確切名稱,他們就可以找到它;像 mysite/procs/this_form.php。不過,我確實在這些腳本的頂部有這幾行。

if($_SERVER["REQUEST_METHOD"] !== "POST") {
   header('Location: ../');
   exit;  
}

有沒有辦法讓我的處理頁面回到 html 根目錄之上,或者這只是常態?

對於我的 index.php 文件中的包含,我../my_stuff/whatever_page用來獲取其他文件,從 html 根目錄返回到 my_stuff 文件夾。但是當我在表單的“action”屬性中包含這些 URL 時,這不起作用。

這些不是“URL”,它們是文件系統路徑。該action屬性的值應該是一個面向公眾的 URL,就像/aboutor /home(與您的範例相關)。

然後,您可以使用“路由器”(中的 if-elseif 塊index.php)來路由請求的 URL,就像您對所有其他 URL 所做的那樣。

例如按照你的例子……

在您的 HTML 中:

<form action="/form-submission" method="POST">
:

index.php

elseif($path === "form-submission" && $_SERVER["REQUEST_METHOD"] == "POST"){
   require_once '../my_stuff/whatever';

但是,如果有人知道文件的確切名稱,他們就可以找到它;像mysite/procs/this_form.php

任何人都可以為您的表單送出頁面送出 POST 請求,就像任何人都可以向您的頁面/about/home頁面發出 GET 請求一樣。您需要實施足夠的驗證和安全措施,這不會成為問題。

我真的不需要發回,因為我使用 Ajax 進行實時響應。

我不太清楚你的意思是什麼。AJAX 只是一個非同步請求。因此,無論請求是從 HTML 同步送出還是從 JavaScript 非同步送出,您仍在向/form-submission.

引用自:https://serverfault.com/questions/1062555