為了進一步清晰而更新:
根據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,則可以是apache
或httpd
、www-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 伺服器授予權限:使用chmod
和chown
執行chmod
666 或 777(不良文件/教程中此類問題的首選解決方案)可以神奇地使事情正常工作,但不安全。授予 666 或 777 權限將授予「其他人」存取權限。因此,不僅是 Apache,還有grandmother
( nsa
前提是這些使用者帳戶存在於您的電腦上 - 但實際上不存在,請避免這樣做,除非只是為了測試/故障排除)。
最好更具體一些,只向您和 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/cache
並app/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 存取)。