標籤:
最近在做一個網站項目遇到了一個很奇怪的問題,現記錄下來希望可以協助到其他的朋友 問題描述:最近公司剛剛在香港購買了一個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
) 解決辦法:
- 給php.ini中的upload_tmp_dir項設定一個臨時目錄並做好相應的許可權(推薦方法)
- 將"C:\Windows\Temp"目錄添加相應的許可權
重要說明:php.ini 的upload_tmp_dir 目錄許可權必須要包含
IUSER和IIS_IUSERS許可權或
Everyone 參考:windows下使用IIS配置的PHP無法上傳檔案的解決方案 php.ini 中未設定 upload_tmp_dir,可能會導致上傳失敗 ,iis主機給個方案吧,官方是不是也沒有辦法 IIS+PHP,解決上傳檔案的時候,目錄為空白的問題
PHP 手冊 php.ini 配置upload-tmp-dir
Windows下建立檔案的許可權問題
來自為知筆記(Wiz)
解決PHP在Windows IIS 上傳的圖片無法訪問的問題