1

我已将 PHP 配置为在表单身份验证/IIS 集成管道下的 Windows Server 2008 上的 IIS7 上的 FastCgi 下运行。PHP 甚至 Drupal 都非常适合经过身份验证的用户。然而,对于匿名请求,所有 PHP 帖子都会挂起,直到 PHP 超时,然后返回 500.0 错误。日志中没有出现错误,即使打开了详细日志记录,返回到屏幕的错误也没有太大帮助:

 Internet Information Services 7.5
 Error Summary HTTP Error 500.0 - Internal Server Error C:\Program Files (x86)\PHP\php-cgi.exe - The FastCGI process exceeded configured request timeout Detailed Error Information
 Module        FastCgiModule
 Notification  ExecuteRequestHandler
 Handler       PHP_via_FastCGI Error
 Code          0x80070102 
 Requested URL http://localhost/application/test.php
 Physical Path D:\Websites\application\test.php 
 Logon Method  Anonymous 
 Logon User    Anonymous

所有经过身份验证的请求都可以正常工作,第二个我将 web.config 身份验证类型从“表单”更改为“Windows”或“无”匿名 PHP 帖子工作。但这并不能解决问题,因为没有人通过身份验证。ASP.Net 和经典 ASP 帖子在 PHP 匿名帖子失败的相同配置下工作。

我尝试过的一些事情包括......

在本地 web.config 中添加和删除 FormsAuthentication 模块(尽管已经继承):

<modules>
    <remove name="FormsAuthentication" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="" />
</modules>

明确允许访问(虽然已经继承):

<authorization>
    <add accessType="Allow" users="*" verbs="GET, POST" />
</authorization>

调整了 PHP.ini 设置,当前设置为:

default_socket_timeout = 60
upload_tmp_dir="C:\Windows\Temp"
session.save_path="C:\Windows\Temp"
log_errors = On
error_log="C:\Windows\temp\php-errors.log"
cgi.force_redirect=0
fastcgi.impersonate=1
cgi.fix_pathinfo=1
fastcgi.logging=0
max_execution_time=30
extension_dir="C:\Program Files (x86)\PHP\ext"
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
max_input_time = 60
memory_limit = 128M
post_max_size = 10M   

将应用程序池标识从 ApplicationPoolIdentity 更改为 NetworkService 到管理员帐户。所有人都给出了相同的行为。

我遵循了 MSDN (http://msdn.microsoft.com/en-us/magazine/cc135973.aspx) 和 IIS.Net (http://learn.iis.net) 上推荐的 PHP.ini 和 web.config 设置/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis-7/)。

当我说一个简单的 PHP Post 失败时,我的意思是简单的:

<form action="test.php" method="post">
   <input type="text" name="testpost" />
   <input type="submit" value="postit" />
</form>
<?php if(isset($_POST['testpost'])) { ?>
   Posted: <?php echo($_POST['testpost']) ?>
<?php } else { ?>
   Waiting for post...
<?php } ?>

我在网上找到的关于这个问题的唯一参考是 Experts Exchange 上的一个未回答的问题 (http://www.experts-exchange.com/Software/Server_Software/Web_Servers/Microsoft_IIS/Q_26706716.html)。

我是 PHP 和 IIS7 的新手,所以在打开和关闭这几个星期后,我想终于是时候问一下我必须忽略哪些简单的事情了。

有人有想法么?

谢谢!

4

2 回答 2

1

您是否尝试将应用程序池设置为“经典”托管管道模式而不是集成?

于 2011-02-18T19:56:11.973 回答
0

我的一位同事发现的一个问题与我们的 web.config 有关。具体来说,通过注释掉以下行,POST 神奇地从 .NET 站点内的虚拟目录中的 PHP 开始工作(因此我们可以专门使用 .NET auth)。

<trace enabled="true" requestLimit="50000000" pageOutput="false" traceMode="SortByTime" localOnly="true"/>
于 2012-06-13T16:42:21.383 回答