Recently in a Web site project encountered a very strange problem, is now recorded in hopes can help other friends problem Description: Recently the company has just bought a Hong KongWindows Server 2008 Server for unified management of a customer's n PHP Web siteThere are three websites on this server, one is a small esports website developed by thinkphp, a corporate website developed using WordPress, a mall mall developed using Ecshopbecause of the first two days of work, so leave to go back for a week (before you go three sites have been deployed to the server but the test is on the other server did not find any problems) after the return of leave the customer feedback a problem: all the site images uploaded after uploading can not be accessed ( previously uploaded images are normally accessed ), because it was tested before leaving and did not find a similar problem, but since the customer feedback that must be resolved, so a lengthy troubleshooting and processing stage first log in to the site background to test found that the uploaded picture in the browser does not open and there is an unreachable error message: "401- Unauthorized: Access is denied due to invalid credentials. ” It then tested several other PHP projects on the server and found the same error:
picture uploaded successfully, but browser does not have permission to accessBecause the test of a few PHP system is not the same, there are thinkphp,wordpress, Baidu Ueditor editor so the probability of these systems at the same time the problem is too small, so basically ruled out the program bug and see the above error to know that the file is there is no access to the permissions, so log on to the remote Desktop to the server to find the uploaded picture directory and found the picture of the test, the picture is uploaded successfully since the uploaded image can be accessed and the picture has been uploaded successfully, then why the new upload of the picture is not accessible? Then view the upload directory, directory permissions already contain "Everyone", directory should be no problem (previously uploaded images can be accessed)
And then a look at the picture properties of the test dumbfounded, the original picture of the properties do not containThe "Everyone" item does not match the permissions of the uploaded directory ( If you create a new file in a directory, the new file inherits the permissions of the directory)See this I can not understand, since the permissions of the directory hasThe "Everyone" Item then the permission to upload the picture should also inherit the permissions of the parent class, so for a long time did not want to understand the reasons for thisso also do not know how to solve, just on the network aimlessly see there are no similar problems, and follow the instructions of the site to try finally inWorkaround for PHP not uploading files under Windows using IIS configuration This article successfully resolves the issue summary: under the Windows platform if PHP is using IIS, then PHP uploads the file to a temporary directory, the first time the file is uploaded ( This configuration item can be configured in php.ini "Upload_tmp_dir" because our server is not configured, so PHP will use the system's Temp directory "C:\Windows\Temp")then PHP will then move the files uploaded in the temp directory to the directory you specified.So there is a problem, that is,The default permissions under the TEMP directory are not the appropriate IIS access permissions(Windows default configuration), the uploaded file is inherited by default when the file is uploaded to the directory.permissions for the temp directorywhen PHP then moves the file to the specified directory, the moved file does not inherit the directory permissions after the moveThis causes the moved file to be accessed from the browser because the file does not have the appropriate permissions (IIS access) and cannot access the normal questionThere was a successful upload of the file, but it appears when the browser accesses"401-Unauthorized: Access is denied due to invalid credentials. "The question Windows default Permissions configuration
the changed permission configuration (must beinclude
Iuser and Iis_iuserspermissions or
Everyone
)Workaround:
- Set a temporary directory for the Upload_tmp_dir item in php.ini and do the appropriate permissions ( recommended method )
- Add the appropriate permissions to the "C:\Windows\Temp" directory
Important notes:php.ini upload_tmp_dir directory permissions must contain
Iuser and iis_iusers permissions or
Everyone Reference: PHP is not able to upload files under Windows using IIS configuration php.ini not set Upload_tmp_dir, may cause upload failure, IIS host to a scheme, the official is not there is no way to iis+php, to resolve the upload file, Problem with empty directory
PHP Manual php.ini Configuration Upload-tmp-dir
Permissions issues for creating files under Windows
From for notes (Wiz)
Resolves an issue where PHP uploads pictures in Windows IIS is inaccessible