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

Posted

技术标签:

【中文标题】在 documentroot(cgi-bin 文件夹)之外运行 PHP 文件【英文标题】:Running PHP file outside of documentroot (cgi-bin folder) 【发布时间】: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 吗?该文件的权限是什么? 为整个文件夹递归地设置了权限,以尝试使其正常工作。我用一些额外的信息更新了问题。 感谢大家的建议,今天会看看他们并尝试分配这个赏金 【参考方案1】:

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

来自这些页面:

https://bugs.php.net/bug.php?id=13316 http://php.net/manual/en/install.unix.commandline.php http://gallery.menalto.com/node/8955

...这似乎可能是由于 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】:

我不太了解使用的设置。但我认为你应该通过以下链接。可能会得到一些帮助。

    http://www.sean-barton.co.uk/2009/02/setting-up-a-phpmysql-local-development-environment-on-a-mac-doing-it-properly/ http://docs.joomlabamboo.com/using-joomla/setting-up-a-quick-start-package-on-your-local-server-xampp-pc http://www.adobe.com/devnet/dreamweaver/articles/setup_php.html How to create Mac OS X dev environment for legacy PHP app?

【讨论】:

以上是关于在 documentroot(cgi-bin 文件夹)之外运行 PHP 文件的主要内容,如果未能解决你的问题,请参考以下文章

Apache 在编辑配置文件并重新启动后搜索旧 DocumentRoot

如何在 XAMPP 的 VirtualHost 中访问 DocumentRoot 之外的文件?

ServerRoot、DocumentRoot 和 Directory 之间的区别

您可以相对于 conf 文件设置 Apache 的 DocumentRoot 吗?

关于Centos6中httpd的DocumentRoot下子文件中的网页文件无法访问题

如何在 cgi-bin 中执行 shell 脚本?