最近在作一個網站項目遇到了一個很奇怪的問題,現記錄下來但願能夠幫助到其餘的朋友
問題描述:
最近公司剛剛在香港購買了一個
Windows Server 2008 服務器用於將一個客戶的N個php網站進行統一管理
該服務器上有三個網站,一個是THINKPHP開發的小型電子競技網站,一個使用WORDPRESS開發的企業網站,一個使用ECSHOP開發的商城商城
因爲前二天家中有事因此請假回去了一個禮拜(走以前三個網站都已經部署到該服務器但測試是在其餘服務器上進行的並無發現什麼問題)
在請假回來後客戶反饋了一個問題:全部網站圖片上傳後沒法訪問(以前上傳的圖片能夠正常訪問),
由於在走以前都是測試過的且並無發現相似的問題,但客戶既然反饋那就必定要解決,因而進行了漫長的排查和處理階段
首先登陸到網站後臺進行了測試發現上傳的圖片在確實瀏覽器打不開且出現了沒法訪問的錯誤信息:「
401 - 未受權: 因爲憑據無效,訪問被拒絕。」
而後又測試了該服務器上其餘幾個php項目發現也出現了同樣的錯誤:
圖片上傳成功,但瀏覽器沒有權限訪問
由於測試的幾個php系統是不同的,有thinkphp,wordpress,百度ueditor編輯器
因此這幾個系統同時出現問題的機率實在是過小了,因此基本上排除了程序的bug
且看到上面的錯誤就知道文件是存在的只是沒有訪問的權限,因而登陸到遠程桌面進入服務器找到上傳的圖片目錄並發現了測試的圖片,說明圖片是上傳成功的
既然以前上傳的圖片能夠訪問且圖片也上傳成功了,那爲何新上傳的圖片卻不能訪問了呢?
因而查看上傳目錄,目錄的權限已經包含"Everyone",目錄應該也沒有問題(以前上傳的圖片均可以訪問)
而後一看測試的圖片屬性傻眼了,原來圖片的屬性中並不包含
"Everyone"項這跟上傳的目錄的權限不相符啊(若是在某個目錄下新建文件,那麼新建的文件是繼承該目錄的權限的)
看到這我就想不明白了,既然目錄的權限有
"Everyone"項那麼上傳的圖片的權限也應該繼承父類的權限纔對,因此好長時間也沒有想明白這其中的緣由
所以也不知道該如何下手解決,只是在網絡上漫無目的看有沒有相似的問題,並按照網站的說明進行嘗試
問題總結:
在Windows平臺下若是PHP使用的是IIS的話那麼php在上傳文件時是先將文件上傳到一個臨時目錄下的
(該配置項能夠在php.ini的"
upload_tmp_dir"裏進行配置,因爲咱們的服務器並無進行過配置
,因此php將使用系統的臨時目錄"C:\Windows\Temp"
)
而後PHP再將臨時目錄中上傳的文件再移動到你指定的目錄中去
這樣就存在一個問題,即
Temp目錄下默認的權限是沒有相應的IIS訪問權限的
(windows默認配置),當文件上傳到該目錄時那麼上傳的文件默認是繼承了
Temp目錄的權限
而PHP再將文件文件移到指定的目錄時,被移動的文件並不會繼承移動後所在的目錄權限
從而致使從瀏覽器訪問被移動的文件時,由於該文件沒有相應的權限(IIS訪問權限)而沒法訪正常問
也就出現了文件上傳成功但瀏覽器訪問時出現
「
401 - 未受權: 因爲憑據無效,訪問被拒絕。
」的問題
Windows默認的權限配置
更改後的權限配置(必須
包含
IUSER和IIS_IUSERS
權限或
Everyone
)
解決辦法:
- 給php.ini中的upload_tmp_dir項設置一個臨時目錄並作好相應的權限(推薦方法)
- 將"C:\Windows\Temp"目錄添加相應的權限
重要說明:
php.ini 的upload_tmp_dir 目錄權限必需要包含IUSER和IIS_IUSERS權限或Everyone
參考:
Windows下建立文件的權限問題
php