在IIS添加网站(假设站点为xxx.yyy.com,本例假设IIS版本为7.5或以上),如果采用IIS默认配置,会在创建站点同时创建相应同名的"应用程序池"(也是xxx.yyy.com)。在这种默认的情况下,其最终用户凭据为"身份验证"当中的"特定用户"(IUSR),访问目录资源时就会验证IUSR的权限。
在添加完站点中,不作其它操作的情况下,直接远程访问(即不在与IIS服务器同个机子上访问)http://xxx.yyy.com/,会出现:
401 - 未授权: 由于凭据无效,访问被拒绝。
原因: IIS处理WEB请求指定目录的时候,会根据 "基本设置"-"连接为" 当中的指定的账户作为路径凭据,如果指定的账户没有该路径的权限,则访问失败(至于出现什么的的失败信息,后讲。上边401是失败信息的形式之一)。
但上边的错误形式并不是详细的错误形式,因为是远程访问的出错信息,如果本机访问(即在IIS服务器同个机子上访问),会是如下更加具体的错误信息:
HTTP 错误 401.3 - Unauthorized
由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置,您无权查看此目录或页面。
错误代码:0x80070005
远程访问与本机访问出现不同错误信息,但都是同一个错误。这个是源于IIS默认配置中httpErrors 项的errorMode 设置为DetailedLocalOnly 。它表示如果站点出错时,如果是本机访问,则输出详细错误,如果是远程访问,则隐藏详细错误。也可以直接配置为"Detailed",此时不管本机还是远程,访问出错都显示详细错误(但如果是真实的服务器,为安全性起见,如果需要,建议配置为DetailedLocalOnly)
为解决IUSR的权限,直接添加目录,给予IUSR账户的读取权限:
之后再次访问,网站可以正常访问了(但这不是最终正确的结果,因为此时,站点根目录里还没有web.config文件)。
在站点功能视图中进行一些操作(如"处理器映射"、"默认文档"、"错误页"),使根目录产生web.config文件。本例进行"默认文档",删除其中的"Default.htm"然后应用,产生的web.config。此时再远程访问,则会出现以下错误:
500 - 内部服务器错误。
您查找的资源存在问题,因而无法显示。
采用本机访问,展示了"500内部服务器错误"相应的更详细的信息:
HTTP 错误 500.19 - Internal Server Error
无法访问请求的页面,因为该页的相关配置数据无效。
错误代码 0x80070005
配置错误 由于权限不足而无法读取配置文件
配置文件 ....... \wwwroot\web.config
可以点击"查看更多信息"即可定位到https://learn.microsoft.com/zh-CN/troubleshoot/developer/webapps/iis/health-diagnostic-performance/http-error-500-19-webpage#hresult-code-0x80070005
该页面显示了该错误的相关解决方案。根据该解决方案,添加wwwroot目录的IIS_IUSRS组的读取权限,即可解决web.config权限问题导致的500.19问题(但问答如何产生的,后讲)
相应,IIS网站的日志文件里也记录了错误信息:(如401.3与500.19错误会分别显示"401 3"与"500 19")
如果需要,可以参见http客户端错误相应文件目录(C:\inetpub\custerr\zh-CN\),该目录汇集了所有常见http错误的一些信息内容显示,如:
另外,如果是PHP目录权限的问题,则访问后会出错。
远程访问时出错信息如下:
本机访问时的详细错误信息如下:
应用程序"XXX.YYY.COM"中的服务器错误
HTTP 错误 500.0 - Internal Server Error
对找不到的文件启用文件监视
错误代码 0x80070003
IIS日志的记录的相关内容为:
下边详解为什么IIS_IUSRS可以解决有web.config文件而不出错。先看一张图:
上图表明: "连接为"的两种方式,对于web.config权限是有影响的。
当"连接为"-特定用户,则站点根目录有特定用户的读取权限时,有没有web.config文件,处理html都不会出现web.config的权限问题。
当"连接为"-应用程序用户(通过身份验证),则站点根目录有特定用户的读取权限时:如果没有web.config文件,则处理html不会出现权限问题。
如果有web.config文件,站点根目录只有特定用户读取权限时,会出现web.config权限问题:500 - 内部服务器错误 或者 HTTP 错误 500.19 - Internal Server Error
上述的500.19错误,可以通过附加应用程序池"标识"(如通用的IIS_IUSRS)的读取权限到该站点根目录来解决问题。
应用程序池"标识"可通过站点的 应用程序池-高级设置-标识 进行设置,默认为ApplicationPoolIdentity。
应用程序池"标识"的设置中,有"内置账户"与"自定义账户"两种。
其中"内置账户"又分四种:LocalSerivce、NetworkService、LocalSystem、ApplicationPoolIdentity,自定义账户则是本地账户(通常创建属于IIS_IUSRS组的用户,但嫌弃权限大,也可以改为Guests组)。
但不管如何指定应用程序池的"标识",其可以通用的权限账户为:IIS_IUSRS以及IIS AppPool\xxx.yyy.com。
任何被设置为应用程序池"标识"的账户(如LocalService或自定义的web_xxx_yyy_com用户),都"拥有"应用程序池默认标识组IIS_IUSRS类似的功能权限(能够执行PHP模块与处理web.config)
所以当设置PHP目录的读取与执行权限以及设置web.config读取权限(设置到web.config的所在目录),可以通用IIS_IUSRS与IIS AppPool\xxx.yyy.com,于是,可以给之前默认设置下出现500.19的站点,
给予根目录IIS_IUSRS读取权限(或IIS AppPool\xxx.yyy.com读取权限)。
一般PHP与IIS搭建时的权限设置,可以有通用的设置:
至此,关于PHP+IIS7.X以及的搭建后权限问题解决是没有问答的(这里以读取权限为例子,至于写入权限,根据最终用户相应指定即可)。
不过如果是单纯的PHP站点,首先应该在站点的应用程序池的"基本设置里",应该将其".NET Framework版本""修改为"无托管代码",以排除asp.net权限方面的干扰,防止asp.net相关的"/"应用程序中的服务器错误。
否则一旦出现"/"应用程序中的服务器错误,就要另到:C:\Windows\Microsoft.NET\Framework64\.NET版本号\Temporary ASP.NET Files 设置另外ASP.NET相关的读取与写入权限了。