【问题标题】:Running PHP file outside of documentroot (cgi-bin folder)在 documentroot(cgi-bin 文件夹)之外运行 PHP 文件
【发布时间】:2012-05-11 18:44:55
【问题描述】:

我正在与一位同事合作,在 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

【问题讨论】:

  • 你确定问题不在于 handler.php 吗?该文件的权限是什么?
  • 为整个文件夹递归地设置了权限,以尝试使其正常工作。我用一些额外的信息更新了问题。
  • 感谢大家的建议,今天会看看他们并尝试分配这个赏金

标签: php xampp virtualhost cgi-bin


【解决方案1】:

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

来自这些页面:

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

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

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

【讨论】:

    【解决方案2】:

    假设 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 系统之间的差异。

    希望有帮助

    【讨论】:

    • 感谢您的回复,不幸的是,前两个答案的组合解决了问题,所以我没有尝试上述方法...我查看了 PHP 手册,我可以想象这样的事情也很有可能解决这个问题。
    • 重要的是你已经解决了你的问题 :) 这可以考虑在 SafeMode 为 On 的情况下(这是最好的)并且你想从其他目录运行 php 脚本,而不是 DocumentRoot ; )
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我相信这样做的好处是您可以以不同的用户身份执行 PHP,例如每个虚拟主机有不同的用户,如果 apache 通过内置模块运行 php 本身,则无法做到这一点。
    【解决方案4】:

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

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

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

    【讨论】:

    • 刚刚检查:apache documentation 似乎同意我的回答。至少它提出了大约相同的配置指令......
    • 感谢这似乎有助于解决我们遇到的问题,但是我确实将 sethandler 值更改为 @A 建议的值。 R. Younce 所以我更新了他的答案。
    【解决方案5】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多