最近在开发微信服务号时碰到一个问题:阿里ECS的
80
端口被IIS占用,而微信服务号中使用JSSDK必须设置安全域名,但是这个安全域名不能带有端口信息。这就产生冲突了。经过一番(URL隐式转发、添加CNAME解析)折腾未果,后来想到干脆把项目从原先的Apache服务器移植到IIS中,在ECS自带的IIS上做子域名绑定是很方便的,又是一番折腾,终于搞定。于是记录下自己踩的坑。
环境:windows server 2007 32bit、IIS7.0、PHP5.6.3
安装PHP
1、去PHP官网选择一个NTS版本下载;
2、解压后将php-5.6.30-nts-Win32-VC11-x86文件夹根目录下的
php.ini-program或php.ini-production改成php.ini。并在php.ini中添加如下配置:
extension_dir = "E:\mingyong\php\ext" #设置php模块路径
date.timezone = PRC #设置时区为中国时区
register_globals = On #开启GET数据调用,PHP5.6以上的版本已废弃,请设置成OFF
short_open_tag = On #php支持短标签
cgi.force_redirect = 0 #开启以CGI方式运行php
fastcgi.impersonate = 1;
cgi.rfc2616_headers = 1
cgi.fix_pathinfo=1
3、此时运行php.exe不报错即为安装成功,如果报MSVCR110丢失,需要安装vc11 - Microsoft Visual C++ 2012 Redistribution。
配置IIS
如果还没有IIS,要在win server的服务器管理器中添加web服务(IIS)
角色。
1、在服务器管理器中选添加角色功能,选中winRM IIS 扩展、CGI
安装。我这里全选了。
2、IIS中添加项目(主机名要和子域名对应,端口为80
,IP地址就是ECS的固定IP),并把ThinkPHP项目copy到对应的物理路劲下
3、选择处理程序映射
添加如图所示的FastCGI模块映射
4、在fastCGI setting
中(如果此时没有fastCGI选项,请安装Administration Pack或者升级到IIS7.5)
编辑FastCGI,添加如图所示的环境变量
url重写
经过以上两步,项目应该能正常访问了,但是由于是ThinkPHP开发的项目,会遇到url重写的问题,此时需要在项目根目录下的web.config
中添加重写规则,添加后的样子如下:
<configuration>
<system.webServer>
<directoryBrowse enabled="false" />
<rewrite>
<rules>
<rule name="cnUrl" stopProcessing="true">
<match url="!^(index\.php|images|assets|robots\.txt)" />
<action type="Rewrite" url="404.php" />
</rule>
<rule name="OrgPage" stopProcessing="true">
<match url="^(.*)$" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^(.*)$" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php/{R:1}" />
</rule>
</rules>
</rewrite>
<httpErrors>
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/404.php" responseMode="ExecuteURL" />
<error statusCode="500" prefixLanguageFilePath="" path="/404.php" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
至此,PHP就可以发布到IIS了。