2012-05-02 43 views
1

我正在与一位同事一起在XAMPP中的MAC上设置本地环境,在Windows上,我的虚拟主机看起来像下面那样。在documentroot(cgi-bin文件夹)之外运行PHP文件

当我访问诸如http://domain.local/cgi-bin/handler.php一个URL的Web服务器正确处理PHP,但在他的,我们得到一个500服务器错误和消息...

The server encountered an internal error and was unable to complete your request. 

Error message: 
Premature end of script headers: 

我们试图改变的cgi-bin的名字文件夹到别的东西,因为我注意到在httpd.conf中有另一个别名,但这没有效果......所以在我看来,这个问题与权限有关。

我们认为别名设置正常,因为访问http://domain.local/cgi-bin/filenothere.php不存在将抛出一个404像预期的那样,任何.html/.pl文件无法执行。

存在于在cgi-bin文件夹是权限...

rwxrwxrwx戴夫人员

,并通过用户和组拥有....

戴夫人员

Vhost

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    ServerName www.domain.local 
    ServerAlias domain.local 
ServerAlias api.domain.local 

    # Indexes + Directory Root. 
    DirectoryIndex index.php 
    DocumentRoot E:/home/www/www.domain.co.uk/htdocs/ 

    # CGI Directory 
    ScriptAlias /cgi-bin/ E:/home/www/www.domain.co.uk/cgi-bin/ 
    <Location /cgi-bin> 
      Options +ExecCGI 
    </Location> 

    # Logfiles 
    ErrorLog E:/home/www/www.domain.co.uk/logs/error.log 
    CustomLog E:/home/www/www.domain.co.uk/logs/access.log combined 
</VirtualHost> 

任何想法是什么导致这个PHP文件不被执行?

UPDATE 试图添加一个头来说PHP的内容是PHP的开始,现在只需输出PHP代码。

它仿佛在为别名指定的路径是可访问的,但服务器不知道如何执行的内容,这是对HTML和PHP

+0

你确定问题不在handler.php中吗?该文件的权限是什么? –

+0

权限是递归设置的整个文件夹,试图使其工作。 我更新了一些额外信息的问题。 – Carlton

+0

感谢您的建议家伙,今天会看看他们,并尝试分配这个赏金 – Carlton

回答

3

我认为你需要为你的cgi-bin的部分。

您的服务器可以向您显示脚本源的事实意味着服务器至少对/ file/system/path/to/cgi-bin和IIRC的读取权限与ScriptAlias b/c ScriptAlias预期/ file /系统/ path/to/cgi-bin由于安全原因无法访问。我认为您的解决方案看起来应该沿着线:

<Directory /file/system/path/to/cgi-bin> 
    Options ExecCGI 
    SetHandler cgi-script 
</Directory 
+0

刚刚选中:[apache文档](http://httpd.apache.org/docs/2.0/mod/mod_alias.html#scriptalias)似乎同意我的回答。至少它提出了关于相同的配置指令... – user1129682

+0

感谢这似乎有助于我们遇到的问题,但是我确实将sethandler的值更改为@A所建议的值。 R. Younce让我更新了他的答案。 – Carlton

1

有(非常)很少需要运行PHP脚本为给定的CGI对于Apache的PHP模块可以直接执行它们。尝试添加这对你的Apache配置:

<FilesMatch \.php$> 
    SetHandler application/x-httpd-php 
</FilesMatch> 

之后只需将PHP脚本到文档根目录网站,看看他们的工作。你会想要删除/ cgi-bin/URL的一部分

你说你在Mac上设置XAMMP,但是你的路径前缀有一个驱动器号(E :)。 OS X没有像Windows这样的驱动器盘符,这也可能导致(部分)你的问题。

0

假设PHP以安全模式运行,您可能需要“打开”cgi-bin目录,因为用户(PHP)脚本的执行仅限于DocumentRoot及其子文件夹。

对于所有我知道你能做到这一点有两种方式

1。编辑php.ini

找到包含open_basedir行。如果在行首有一个评论 - 分号 - 将其删除。然后添加您的cgi-bin目录。

open_basedir = "E:\home\www\www.domain.co.uk\cgi-bin\"

如果需要打开多个目录,你可以使用分号;作为分隔符。在基于Linux的服务器,使用冒号:

open_basedir = "E:\home\www\www.domain.co.uk\cgi-bin\;E:\home\www\www.domain.co.uk\another_dir\"

像我这样的,你的服务器是由第三方托管的情况下,你需要第二个选项(好样的)

2 。编辑您的虚拟主机

以下内容添加到您的虚拟主机,DocumentRoot后即:

php_admin_value open_basedir "E:\home\www\www.domain.co.uk\cgi-bin\"

同样的规则适用于多个目录以及上述Linux和Windows系统之间的区别。

希望帮助

+0

感谢您的回应,不幸的是,前两个答案的组合解决了问题,所以我没有去尝试上述......我看了一下PHP手册,我可以想象,像这样的东西也有很好的机会也解决了这个问题。 – Carlton

+0

重要的是你已经解决了你的问题:)在SafeMode为On的情况下(这是可取的),并且你想从其他目录运行php脚本,这与DocumentRoot不同); – Havelock

0

你知道PHP是否运行为CGI程序或Web服务器模块?如果你可以得到一个phpinfo()页面(可能来自网站根目录中的常规文件夹),你应该能够找到它。如果您作为网络​​服务器模块运行,那么您应该在顶部附近有一个标题为Server API的部分,该部分表示Apache 2.0 Handler(或同等)。

从这些网页:

...看来,它可以是由于PHP运行的CGI脚本,要不然PHP和另一个CGI处理程序之间的冲突。

第三个链接页面上的一张海报发现,他们类似听起来的end of script headers问题已通过在其.htconfig/vhosts文件中删除/注释掉Options +ExecCGI行来解决。

可能值得通过上面的链接看看你的问题是否有关。