授予 PHP 寫入檔案和資料夾的權限

授予 PHP 寫入檔案和資料夾的權限

為了進一步清晰而更新:

根據http://expressionengine.com/user_guide/installation/installation.html, 它說:

對於大多數 Unix 主機,以下是典型的,但您可以諮詢您的主機,看看是否可以使用更嚴格的權限允許 PHP 寫入檔案 (666) 和資料夾 (777)。在 Windows 伺服器上,以下內容不適用,但您需要確保檔案和資料夾可由 ExpressionEngine 寫入。您可能需要為此聯絡您的房東。

不知道這意味著什麼。我可以將特定檔案和資料夾分別更改為 666 和 777,我是 chown'er,但上面聽起來我也需要允許 PHP 執行此操作?

原問題:

我需要確保 PHP 可以寫入特定檔案 (666) 和資料夾 (777)。

我該怎麼做呢?

答案1

我將透過技術解決方案來完成 rahmu 和 MV 的答案。以下所有內容僅適用於類 UNIX 系統。

捲動瀏覽 chmod/chown 部分,查看使用 ACL 的範例 - 比 UNIX 檔案模式更強大的工具。

尋找您的網頁伺服器使用者名

首先,您需要知道您的網頁伺服器運行的使用者名稱。如果您使用的是 Apache,則可以是apachehttpdwww-data等。www-data對nginx來說,一般也是www-data

要檢查它,請嘗試:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

確保此命令返回的用戶名是一致的(例如,我 99% 的時間都使用 nginx,但此命令返回tomcat7,我安裝過一次的 Java Web 伺服器)


向 Web 伺服器授予權限:使用chmodchown

執行chmod666 或 777(不良文件/教程中此類問題的首選解決方案)可以神奇地使事情正常工作,但不安全。授予 666 或 777 權限將授予「其他人」存取權限。因此,不僅是 Apache,還有grandmothernsa前提是這些使用者帳戶存在於您的電腦上 - 但實際上不存在,請避免這樣做,除非只是為了測試/故障排除)。

最好更具體一些,只向您和 Apache 授予權限。更改文件組,將文件的完全控制權交給 Web 伺服器。為此,請遞歸地更改所有者:

chown -R www-data:www-data your/folder/

但最有可能的是,您可能希望僅透過更改群組來保持對檔案的完全存取權限:

chown -R yourusername:www-data your/folder/

然後,執行適當的操作chmod以授予該群組www-data與您相同的權限。例如,如果目前模式是 640(6代表你,4代表www-data,0代表其他,翻譯為-rw-r-----),將其設為 660(6代表你,6代表www-data,0代表其他,翻譯為-rw-rw----)。請參閱 rahmu 的答案以了解有關文件模式的更多信息,這是一種古老但優雅的機制。

為了避免使用 操作神秘的數字chmod,您也可以使用以下語法:

chmod -R g+rw your/folder/

它的意思是「向群組(g)新增(+)對資料夾 的讀寫(rw)權限your/folder/,遞歸地(-R)」。

在 90% 的情況下,這應該足夠了。


我的首選方法:使用 ACL(存取控制清單)

有時第一個解決方案是不夠的。我將舉個例子交響樂框架記錄並快取大量資料。因此它需要對適當資料夾的寫入權限。

當您在 CLI(在我的使用者帳戶下)和 Web(Web 伺服器使用者)中並行使用 Symfony 控制台時,chmod/方法可能還不夠。chown這會導致很多問題,因為 Symfony 不斷修改權限。

在本例中,我們將使用 ACL(存取控制清單),這是在許多 UNIX 系統上管理權限的更高級方法。

這裡是 Symfony 官方文件給予的命令(請更改app/cacheapp/logs根據您的需要):

在支援的系統上chmod +a(即非 Debian/Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

在不支援的系統上chmod +a(最常見)

您將需要該setfacl工具;也許它是預設安裝在您的系統上的,因此請嘗試setfacl -v查看該命令是否可用。

如果該命令不可用,如果您使用的是 Ubuntu 14.04+,您只需安裝該工具:

sudo apt install acl

否則,請遵循作業系統文檔,因為您可能需要更改分割區的安裝方式(Ubuntu 文件在這裡)。

我們就在那裡:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

我對這種方法從來沒有任何問題,滿意或退款。

答案2

無論文件的所有者是誰,666 權限和 777 就足夠了:最後一個數字確保每一個系統上的使用者俱有存取權限。雖然這是最簡單的方法,但由於確切原因,它絕對不是最安全的。

更好的方法

您需要了解的第一件事是Unix 權限如何運作。為了理解我在此連結中給出的答案,請注意權限可以轉換為數字:

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

那麼Achmod 666相當於將權限改為rw-rw-rw.

接下來,您必須找出正在執行 PHP 腳本的使用者。通常,這將是執行您的 Web 伺服器的使用者。這是如何執行此操作的範例(您可以將 Apache 替換為您的 Web 伺服器的名稱)。

一旦您知道執行腳本的使用者以及您提到的文件的擁有者,您就可以設定適當的權限。請記住,授予寫入權限(甚至讀取權限)每一個您系統上的使用者可能會造成災難性的後果。

答案3

Expression Engine 就像許多其他 PHP Web 應用程式一樣,需要對某些檔案和目錄進行讀取+寫入存取。例如,EE 需要對其 config.php 和 database.php 檔案的寫入存取權限,以及對其檔案上傳目錄的寫入存取權限。

文件說明的是,由於大多數伺服器將 PHP 作為 mod_php 運行(因此以 Web 伺服器的權限運行),並且您可能會使用自己的用戶透過 FTP(或類似的)上傳文件,這些文件和目錄需要被授予權限666(每個人都可以讀寫)和777(每個人都可以讀、寫和瀏覽)。

這不是最安全的方法,但肯定是最簡單的方法,特別是如果您使用託管服務。

但是,如 EE 說明所述,請詢問您的主機供應商,因為有些不使用 mod_php,而是使用 fastcgi、suphp 或其他版本。這些伺服器以您自己的使用者身分執行 PHP,因此 PHP 以及 EE 腳本建立的任何檔案都可以讀取和寫入您上傳的所有檔案。在這種情況下,需要為 PHP 存取的檔案和目錄授予 600 和 700 存取權限。由 Web 伺服器(而不是 PHP 執行時間)直接存取的其他檔案仍需要 666 和 777 存取)。

相關內容