IIS+WordPress HTTP 500错误及乱码解决方法

最近尝试把站点搬到了Windows上,结果出现了各种各样的问题:先是安装Wordpress时无缘无故出现HTTP 500,之后带有中文固定链接的文章又全部404,上传文件和安装主题等操作时也会引发HTTP 500,经过好一番折腾之后终于搞定了。

首先,去微软官网下载安装IIS用的URL Rewrite组件,重启IIS后可以设置URL重写规则。Apache的htaccess重写规则可以直接导入,但是不支持RewriteBase等指令。

然后确认一下PHP.ini的配置项
default_charset设置为UTF-8,其他encoding参数留空或者设置为UTF-8
mbstring.encoding_translation关闭

然后找到网站目录,在安全选项卡中赋予IUSR写入权限,否则Wordpress不能安装。

安装好之后如果希望固定链接能正常工作,需要修改wp-includes/class-wp.php,将parse_request函数中的

修改为

如图所示

接下来Wordpress页面应该能正常工作了。
但是会发现仍然不能上传文件,以及安装主题、插件等,均提示HTTP 500错误。原因是PHP默认的上传临时目录为TEMP文件夹,而IUSR对这个目录没有写入权限。我建议直接修改PHP的上传临时目录,在wwwroot下新建一个temp文件夹即可。

此时偶尔还是会在安装主题、插件时出现偶发的HTTP 500错误,其实这些都是虚假的警告。CGI程序在标准错误输出中写入内容时会被IIS判定为执行失败,返回500页面,实际上这些都是PHP输出的警告信息。我们需要修改IIS的CGI设置。


将标准错误模式设置为IgnoreAndReturn200即可。

我还遇到过一个问题,访问网站的PHP页面时出现类似下面的提示:

HTTP 错误 500.19 – Internal Server Error
无法访问请求的页面,因为该页的相关配置数据无效。
通知 ExecuteRequestHandler
处理程序 StaticFile
错误代码 0x800700b7
配置错误在唯一密钥属性“value”设置为“index.php”时,无法添加类型为“add”的重复集合项
原因是webconfig配置冲突,IIS中的配置有主机-网站-目录三个层次,在配置CGI程序和其他全局设置的时候应该在主机层级上设置,这样可以避免配置文件冲突的问题。

关于字符编码的问题,中文系统下URL Rewrite模块重写后的编码会变为GBK,我曾经尝试过打开mbstring.encoding_translation,将http_input设置为GBK,但是发布文章等场合的内容也全部变成了乱码。其实只要在class-wp中利用iconv转换一下就可以了。

 

使用环境:
Windows Server 2012 R2 Datacenter (64-bit)
Internet Information Services 8.5
PHP 5.6.7 (32-bit)
Wordpress 4.1.0