这里的问题几乎可以肯定与文件权限有关。
从命令行运行时php.exe
,您以自己的登录用户身份运行。从 IIS 运行 PHP 脚本时,为了响应 http 请求,php.exe 以不同的用户身份运行。根据您的 Windows 版本,它可能是
IUSR_machine
- 在 IIS6 和更早版本上
IUSR
在 IIS7 及更高版本上
这些用户需要对要执行的 php 文件的权限。
阅读更多关于它的信息
在 IIS7 及更高版本上,我使用一个命令行工具icacls.exe
来设置 IIS 需要读取的目录或文件及其启动的进程(如 php.exe)的权限。这种安全性适用于所有 IIS 应用程序:PHP、ASPNET、ASP-classic、Python 等。
IIS 还需要能够读取静态文件,如 .htm、.js、.css、.jpog、.png 文件等。您可以为所有这些设置相同的权限:读取和执行。
您可以直接向用户授予权限,如下所示:
icacls.exe YOUR-FILE-GOES-HERE /grant "NT AUTHORITY\IUSR:(RX)"
您还可以向 IUSR 所属的组授予权限,如下所示:
icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(RX)"
无论哪种情况,您都可能需要在设置文件级权限后停止并重新启动 IIS。
如果您的 .php 脚本读取和写入其他文件或目录,则同一用户需要对这些其他文件和目录的权限。如果您需要 .php 脚本才能删除文件,那么您可能需要
icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(F)"
...授予文件的全部权限。
您也可以授予对整个目录的权限,指定将来在该目录中创建的所有文件都将继承在该目录上设置的特定于文件的权限。例如,为目录设置文件权限,然后将一堆文件复制到其中,所有文件都从父级获得权限。使用 OI 和 CI 标志执行此操作(这些首字母代表“对象继承”和“容器继承”)。
icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"
copy FILE1 DIRECTORY
copy FILE2 DIRECTORY
...
当我想在 IIS 中创建一个新的 vdir 以允许运行 PHP 脚本、ASPX 或 .JS(是的,ASP Classic)或 Python 或其他任何东西时,我执行以下步骤:
appcmd.exe add app /site.name:"Default Web Site" /path:/vdirpath /physicalPath:c:\docroot
icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"
然后我将文件放入目录中,它们会获得适当的权限。
在目录上设置 ACL(访问控制列表)不会更改目录中已存在文件的 ACL。如果要对目录中已有的文件设置权限,则需要对特定文件使用 icacls.exe。icacls 接受通配符,它还有一个/t
递归开关。