由於權限錯誤,PHP 無法保存會話
我知道這個問題之前一定被問過(並回答過),但我在任何這些問題中都找不到解決我的問題的方法。有點奇怪…問題是我的 PHP 腳本(和我的 Apache 伺服器)無法寫入我係統上的文件夾。一點也不。
例如,我在執行腳本時收到以下錯誤:
致命錯誤:未擷取的異常 ‘Zend_Session_Exception’ 帶有消息 ‘Zend_Session::start() - /var/www/subdomains/vmb/vendor/zendframework/zendframework1/library/Zend/Session.php(Line:482): 錯誤 #2 session_start ():打開(/var/www/subdomains/vmb/application/../var/session/sess_ingph33ir4shr1e60kkifp37s7,O_RDWR)失敗:權限被拒絕(13)
我有一個帶有 CentOS 7、Apache2.4、PHP5.6(與 apache php mod 一起執行)和其他一些東西的 VPS。Apache 作為使用者 apache 和組 apache 執行(在 httpd.conf 文件中設置)。我已經將
session_path
in both/etc/php.ini
and/etc/httpd/conf.d/php.conf
to/tmp/phpsessions
和 chown’d/chmod’ 這個文件夾設置為 apache:apache 777。上面的範例將會話儲存在另一個文件夾中(這也是 chown’d/chmod’ 作為 apache:apache 777),但我其他文件夾也出現同樣的錯誤。所以我的 apache 伺服器作為 apache:apache 執行,我將文件夾 chownd 到我需要的 apache:apache,即使有 777 權限 Apache 也無法寫入這些文件夾。
你見過這樣的事情嗎?我以前沒有…
假設權限和所有權都可以,我相信這與
SELinux
.快速而骯髒的方式:……假設你正在
Permissive
執行getenforce
,嘗試SELinux
通過執行禁用setenforce 0
並再次點擊你的腳本,如果它有效,那麼它是SELinux
,從那裡你可以禁用它(不推薦)或重新打開它通過執行setenforce 1
並檢查您/var/log/audit/audit.log
的最終解決方案。
由於一些配置挑戰而放棄 SELinux 似乎是一個糟糕的選擇。相反,我建議花一點時間去了解它,並尋找合適的解決方案。在這種情況下,看起來一個解決方案可能是在您需要可寫的文件夾上設置httpd_sys_rw_content_t(注意 ‘w’ 表示寫入)文件上下文。請記住,selinux fcontext 使用正則表達式作為目標,因此您的命令可能看起來像這樣:
semanage fcontext --add \ -t httpd_sys_rw_content_t \ '/var/www/subdomains/vmb/var/session(/.*)?'
正則表達式將上下文規則應用於會話目錄下的所有文件,以及目錄本身。
將策略(僅需要一次)應用於目錄和其中的任何文件:
restorecon -R /var/www/subdomains/vmb/var/session
可能還有很多其他的東西,但這至少對我有用。