在documentroot(cgi-bin文件夹)之外运行PHP文件

时间:2012-05-02 09:44:05

标签: php xampp virtualhost cgi-bin

我正在和一位同事一起在XAMPP的MAC上设置他们的本地环境,在windows上我的vhost看起来就像下面那样。

当我访问像http://domain.local/cgi-bin/handler.php这样的网址时,网络服务器会正​​确处理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 dave staff

并且由用户和组拥有....

戴夫员工

VHOST

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    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文件无法执行吗?

更新 尝试添加一个标题,说内容是PHP到PHP文件的开头,现在只需输出PHP代码。

就好像可以访问Alias中指定的任何路径,但服务器不知道如何执行内容,这适用于HTML和PHP

5 个答案:

答案 0 :(得分:3)

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

您的服务器可以向您显示脚本源这一事实意味着服务器至少具有对/ file / system / path / to / cgi-bin和IIRC的读取权限,与ScriptAlias发生冲突b / c ScriptAlias期望/文件/系统/ path / to / cgi-bin出于安全原因无法访问。我认为你的解决方案应该看起来像:

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

答案 1 :(得分:1)

由于Apache的PHP模块可以直接执行它们,因此很少需要将PHP脚本作为CGI运行。尝试将此添加到您的Apache配置:

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

然后只需将PHP脚本放入站点的文档根目录中,看看它们是否有效。您需要删除网址的/ cgi-bin /部分

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

答案 2 :(得分:0)

答案 3 :(得分: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。修改您的VirtualHost

将以下内容添加到您的VirtualHost中,即在DocumentRoot之后:

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

此处适用于多个目录以及上述Linux和Windows系统之间的差异。

希望有所帮助

答案 4 :(得分:0)

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

从这些页面:

......似乎可能是由于PHP作为CGI脚本运行,或者是PHP与另一个CGI处理程序之间的冲突。

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

可能值得阅读以上链接,看看您的问题是否相关。