把Laravel專案上傳到寶塔,網站卻顯示目錄、404,甚至把不該公開的檔案送給訪客,先核對「專案放在哪裡」和「網站從哪裡提供檔案」。兩者可以是不同目錄。框架把公開入口放在public時,不能只因整包程式已上傳,就讓網站直接指向專案根目錄。
以下依寶塔、Laravel、Nginx及PHP官方文件整理設定方法。目錄樹是說明用示例,請換成自己的實際路徑;不同專案的入口結構不同,不能看到public這個名稱,就替所有網站套用同一設定。
先找入口,不先猜目錄名稱
先看專案的部署文件,確認哪個目錄包含對外入口。以Laravel為例,官方部署文件要求Web伺服器把請求導向public/index.php,並明確提醒不要把index.php移到專案根目錄,否則可能暴露敏感設定。
my-project/
app/
bootstrap/
storage/
vendor/
.env
public/
index.php
images/
這個示例中,my-project是完整程式所在目錄,public才是網站公開入口。app、vendor與.env不應因為上傳到同一專案,就成為瀏覽器可以直接取得的網站檔案。不要用「先把網站開起來再說」為理由,將所有內容放進公開入口。
如果是純HTML網站,入口可能就在上傳目錄;如果是其他框架,則以它的部署文件為準。也確認目前資料夾不是壓縮包解開後多套一層的結果,例如你以為指向專案,實際卻指向只包含另一個專案目錄的外層。
寶塔的網站目錄與運行目錄分開核對
寶塔官方網站目錄說明,把網站目前部署目錄與運行目錄分開列出。運行目錄用來指定二級目錄,文件以ThinkPHP5與Laravel這類程式為例。這不是要求把完整專案搬進public,而是讓Web入口落在正確的位置。
在網站清單選中正確站點,查看它的網站目錄,再核對運行目錄。先記下變更前的完整路徑,避免同一台伺服器有多個相似站點時,把另一個網站的目錄改掉。若清單顯示的路徑和你上傳的位置不同,先處理這個差異。
假設專案放在/www/wwwroot/example.com,且公開入口確實是它下面的public,核對結果應讓網站從該public提供內容。介面中的相對目錄和最後生效的完整路徑要一起看,不要只憑下拉選單裡有public就判定完成。
使用Nginx時,查看最後生效的root
Nginx官方root指令說明,檔案路徑一般由root所設目錄與請求URI組合。這表示相同的網址,在不同root下會查找不同檔案。若你讀到的是另一份server配置,或者相關location另有設定,單看一個目錄值仍不足以確認所有請求。
Laravel官方的Nginx部署示例把root指向專案的public,並配合請求轉交入口程式的規則。只改root而漏掉框架路由規則,可能使首頁能開,內頁仍404。應依實際Web服務和框架版本核對整套部署要求,不從網上隨便貼一段配置覆蓋現有站點。
這篇用Nginx說明檔案入口原理;若站點使用Apache或其他服務,請核對相應的文件根目錄與路由配置。不要把Nginx指令貼到另一種服務,或把寶塔欄位的顯示值當成所有服務都採用相同配置的證據。
看到404,先區分靜態檔案與框架路由
先挑一個你確認存在的公開靜態檔案,例如public/images內的測試圖片,再看它的網址是否符合公開目錄結構。當public已是文件根目錄,網址通常不再額外帶一層public;不要把磁碟上的完整路徑原樣接到域名後面。
如果靜態檔案也404,優先核對選中的站點、公開目錄、檔名大小寫及檔案是否真正存在。如果靜態檔案正常,但框架內頁404,再查請求如何交給入口程式。這個順序可以避免一看到404,就反覆更改運行目錄。
也不要只檢查首頁。首頁可能由現存HTML檔案提供,並沒有經過你打算使用的PHP入口。應分別核對首頁、已知靜態資源與一條合法的框架路由,記下各自結果,再決定下一個要處理的設定。
防跨站設定不代替公開入口
寶塔網站目錄頁也提供防跨站攻擊設定,涉及PHP的open_basedir。PHP官方文件將它描述為限制PHP可存取檔案的位置,並提醒這只是額外安全措施,不能作為完整安全保證。
因此,即使啟用防跨站,也不能把專案根目錄當作公開目錄,期待它替Web伺服器擋住所有敏感檔案。瀏覽器取得靜態檔案和PHP程式讀取檔案,是不同的行為;公開入口仍需依框架要求設定。
若改入口後PHP報出路徑限制錯誤,核對錯誤涉及哪個檔案和允許範圍,再按專案需要處理。不要為了消除一行錯誤就關閉所有限制,更不要把其他網站的目錄加入,讓本來分開的站點互相讀取資料。
搬站時重新核對路徑,不沿用舊機器的字串
從另一台主機搬過來時,舊配置中的絕對路徑不一定適用新站點。先確認新機器上的專案位置,再核對公開入口和相關程式路徑;不能因域名相同,就認為磁碟目錄、PHP環境與檔案權限也完全相同。
若目前站點已有正常服務,先記錄配置及可還原的版本,再安排範圍明確的變更。更改運行目錄後,使用剛才列出的靜態資源與合法路由重新檢查;出現異常時保留錯誤,不要連續嘗試多個猜測路徑,讓原本可用的設定也失去追蹤。
目錄正確後,再處理執行條件
正確的public入口不代表整個部署已完成。Laravel仍有PHP版本、擴充功能、依賴、環境設定與可寫目錄等要求。官方文件特別列出storage與bootstrap/cache的寫入權限;這些是程式執行條件,不應以公開整個專案來迴避。
遇到500時,保留發生時間、網址與相應錯誤日誌,先判斷是入口配置、PHP執行,還是程式本身的問題。不要在無法辨認原因時同時改目錄、版本與權限,否則即使恢復,也很難知道是哪個變更起作用。
最後保存專案完整路徑、公開入口、Web服務類型與核對結果。下次更新專案時,完整程式仍按原結構部署,對外目錄保持明確;維護者就不會把「程式放置位置」誤當成「所有檔案都可公開的位置」。

評論0