在 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 吗?