1

我正在与一位同事合作,在 XAMPP 中的 MAC 上设置他们的本地环境,在 Windows 上,我的虚拟主机如下所示。

当我访问像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 戴夫员工

并且归用户和组所有....

戴夫员工

虚拟主机

<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 代码。

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

4

5 回答 5

3

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

您的服务器可以向您显示脚本源的事实意味着服务器至少具有 /file/system/path/to/cgi-bin 和 IIRC 的读取权限,这与 ScriptAlias b/c ScriptAlias 期望 /file/system/path/出于安全原因,to/cgi-bin 不可访问。我认为您的解决方案应该类似于以下内容:

<Directory /file/system/path/to/cgi-bin>
    Options ExecCGI
    SetHandler cgi-script
</Directory
于 2012-05-07T11:57:14.010 回答
2

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

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

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

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

于 2012-05-08T06:53:20.490 回答
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,即之后DocumentRoot

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

与上述相同的规则适用于多个目录以及 Linux 和 Windows 系统之间的差异。

希望有帮助

于 2012-05-08T13:02:33.380 回答
0

你知道 PHP 是作为 CGI 程序运行还是作为 web 服务器模块运行?如果您可以使 phpinfo() 页面正常工作(可能来自网站根目录内的常规文件夹),您应该能够找到这一点。如果您作为网络​​服务器模块运行,那么您应该在顶部附近有一个部分,其标题为Server APIApache 2.0 Handler或等效)。

从这些页面:

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

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

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

于 2012-05-08T16:42:57.237 回答