我正在和一位同事一起在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
答案 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
问题。
可能值得阅读以上链接,看看您的问题是否相关。