解决IIS7上WordPress的权限问题

时间:2012-06-05 14:04:26

标签: wordpress iis-7

我在通过WPI安装的Win2k8 / IIS7上运行WordPress(使用httpcache,fastCgi& UrlRewriter 2.0)。一切似乎都运行良好(上传,通过Live Writer发布,评论,插件,漂亮的URL)。

我正在尝试将WordPress更新到最新版本,但我收到如下错误:

  

下载失败。文件流的目标目录没有   存在或不可写

这与尝试下载主题或更新插件时出现的错误相同。

事件日志中没有错误,WordPress并没有真正告诉我它正在寻找哪个目录,它认为它正在使用什么用户或缺少什么权限。

我已经双重(和三重)检查了IIS App Pool用户是否已明确设置,并且该目录具有该用户的修改权限,最后这些权限已被传播到子文件夹。

根据Google博士的建议,我还在配置文件中添加了以下设置:

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

define('WP_TEMP_DIR', ABSPATH . 'wp-content/');
define('FS_METHOD', 'direct'); 

我错过了配置选项或设置吗? WordPress需要牺牲一只小猫和/或阿尔及利亚人吗?

2 个答案:

答案 0 :(得分:8)

来自PHP manual on IIS7 installation(强调我的):

  

模拟和文件系统访问

     

建议在使用时在PHP中启用FastCGI模拟   IIS。 这是由中的fastcgi.impersonate指令控制的   php.ini文件。启用模拟后,PHP将执行所有操作   文件系统操作代表已经用过的用户帐户   由 IIS身份验证确定这确保即使相同   PHP进程在不同的IIS网站(PHP脚本)之间共享   在那些网站将无法访问彼此的文件   只要不同的用户帐户用于IIS身份验证   每个网站。

     

例如,IIS 7在其默认配置中具有匿名性   使用内置用户帐户启用身份验证IUSR用作   默认身份。 这意味着为了让IIS执行PHP   脚本,有必要授予IUSR帐户读取权限   那些脚本。如果PHP应用程序需要执行写操作   某些文件或将文件写入某些文件夹然后是IUSR帐户   应该有写入权限。

"Should I impersonate PHP via FastCGI?" question on ServerFault中所述,如果您授予服务器上的匿名用户写访问权限,则存在安全问题。例如,如果您还启用了WebDAV模块,则任何人都可以使用此协议写入您的目录!

因此我的推荐是:

  1. 确保所有网站都分配了自己的唯一应用程序池
  2. 在应用程序池的处理模型下的高级设置中,将内置帐户设置为ApplicationPoolIdentity
  3. 使用fastcgi.impersonate = 0 php.ini 中禁用模拟,因此PHP在IIS中设置的应用程序池标识下运行。
  4. 使用automatically generated application pool user account设置对文件夹的读/写权限(例如“IIS AppPool \ MyAppPoolName”)。
  5. 这样,所有PHP脚本都可以保证在系统帐户下运行,与站点的应用程序池相关联(将其与其他站点隔离),并且不会通过模拟意外获得过于公开访问。

答案 1 :(得分:2)

如果我错了,请纠正我,但我相信以下配置提供了相同的好处,并且还尊重PHP所需的fastcgi.impersonate = 1设置。

步骤1,2和4是相同的 - 步骤3是不同的。

  1. 确保每个站点都有自己的应用程序池(与上面相同)
  2. 在高级设置下>处理模型>应用程序池标识(与上面相同)
  3. IIS>身份验证>匿名身份验证>应用程序池标识(不是IUSR)
  4. 使用IIS AppPool \ MyAppPoolName设置读/写权限(与上面相同)
  5. 我们不授予对Webroot的IUSR或IIS_IUSRS访问权限。所有权限都分配给IIS AppPool \ MyAppPoolName