解決PHP在Windows IIS 上傳的圖片無法訪問的問題


最近在做一個網站項目遇到了一個很奇怪的問題,現記錄下來希望可以幫助到其他的朋友
 
問題描述:
最近公司剛剛在香港購買了一個 Windows Server 2008 服務器用於將一個客戶的N個php網站進行統一管理
該服務器上有三個網站,一個是THINKPHP開發的小型電子競技網站,一個使用WORDPRESS開發的企業網站,一個使用ECSHOP開發的商城商城
由於前二天家中有事所以請假回去了一個禮拜(走之前三個網站都已經部署到該服務器但測試是在其他服務器上進行的並沒有發現什么問題)
 
在請假回來后客戶反饋了一個問題:所有網站圖片上傳后無法訪問(之前上傳的圖片可以正常訪問), 因為在走之前都是測試過的且並沒有發現類似的問題,但客戶既然反饋那就一定要解決,於是進行了漫長的排查和處理階段
 
 
首先登錄到網站后台進行了測試發現上傳的圖片在確實瀏覽器打不開且出現了無法訪問的錯誤信息:“ 401 - 授權: 由於憑據無效,訪問被拒絕。
 
然后又測試了該服務器上其他幾個php項目發現也出現了一樣的錯誤: 圖片上傳成功,但瀏覽器沒有權限訪問
 
因為測試的幾個php系統是不一樣的,有thinkphp,wordpress,百度ueditor編輯器
所以這幾個系統同時出現問題的概率實在是太小了,所以基本上排除了程序的bug
 
且看到上面的錯誤就知道文件是存在的只是沒有訪問的權限,於是登錄到遠程桌面進入服務器找到上傳的圖片目錄並發現了測試的圖片,說明圖片是上傳成功的
既然之前上傳的圖片可以訪問且圖片也上傳成功了,那為什么新上傳的圖片卻不能訪問了呢?
於是查看上傳目錄,目錄的權限已經包含"Everyone",目錄應該也沒有問題(之前上傳的圖片都可以訪問)
 

然后一看測試的圖片屬性傻眼了,原來圖片的屬性中並不包含 "Everyone"項這跟上傳的目錄的權限不相符啊(如果在某個目錄下新建文件,那么新建的文件是繼承該目錄的權限的)
 
 
看到這我就想不明白了,既然目錄的權限有 "Everyone"項那么上傳的圖片的權限也應該繼承父類的權限才對,所以好長時間也沒有想明白這其中的原因
因此也不知道該如何下手解決,只是在網絡上漫無目的看有沒有類似的問題,並按照網站的說明進行嘗試
 
最后在 windows下使用IIS配置的PHP無法上傳文件的解決方法這篇文章的幫助下成功解決了該問題
 
問題總結:
在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
 
解決辦法:
  1. 給php.ini中的upload_tmp_dir項設置一個臨時目錄並做好相應的權限(推薦方法)
  2. 將"C:\Windows\Temp"目錄添加相應的權限
重要說明:
php.ini 的upload_tmp_dir 目錄權限必須要包含IUSER和IIS_IUSERS權限或Everyone
 
參考:
 
 

Windows下創建文件的權限問題




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM