[英]intricacies of adding php5_module to an apache server
我对服务器上的php文件和perl文件(或与此有关的任何其他文件)之间的差异有很多疑问。 但我将尝试从简单开始并逐步完善。
首先,我在Mac上清理了已安装的OSX Yosemite。 该操作系统已预安装Apache2。 我没有对httpd.conf进行任何更改,并且文件位于此处:
DocumentRoot "/Library/WebServer/Documents"
我有3个具有相同内容的文件welcome.pl,welcome.php和welcome.txt。
$name="Matt";
$email="foo@bar.com";
print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
除了welcome.pl替换
$email="foo@bar.com";
同
$email="foo\@bar.com";
由于perl脚本会转义@符号,因此唯一的区别就是扩展名。
如果我启动我的apache服务器并打开三个浏览器窗口并转到它们各自的页面,则它们看起来都是一样的:
(在Safari和Chrome中复制)
同样,如果我打开三个浏览器窗口并转到它们各自的文件系统资源,则它们看起来都相同:
(在Safari和Chrome中复制)
但是,如果我随后通过取消注释启用php:
#LoadModule php5_module libexec/apache2/libphp5.so
在我的httpd.conf文件中,重新启动服务器并打开三个浏览器窗口,然后转到它们各自的页面,然后welcome.php更改为:
(在Safari和Chrome中复制)
但是,如果再次访问它们各自的文件系统资源,则它们看起来都一样。 为什么服务器对php文件的解析方式有所不同?
现在让我们将welcome.php更改为
<?php
$name="Matt";
$email="foo@bar.com";
print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>
如果我保存文件并重新启动服务器,则会得到:
(在Safari和Chrome中复制)
这很有意义,但是如果我将welcome.pl更改为:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
$name="Matt";
$email="foo\@bar.com";
print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
我仍然得到:
(在Safari和Chrome中复制)
但是,如果我取消评论:
#LoadModule cgi_module libexec/apache2/mod_cgi.so
在“模块”部分中,替换
Options FollowSymLinks Multiviews
有:
Options FollowSymLinks Multiviews ExecCGI
在“ Library / WebServer / Documents”目录指令中并添加
AddHandler cgi-script .cgi .pl
在“ Library / WebServer / Documents”目录指令中,然后如果我重新启动服务器,则会得到:
(在Safari和Chrome中复制)
但是现在如果我更换
AddHandler cgi-script .cgi .pl
AddHandler cgi-script .cgi .pl php
重新启动服务器并转到localhost / welcome.php
然后出现内部服务器错误(在Safari和Chrome中复制)
但是如果我替换
<?php
$name="Matt";
$email="foo@bar.com";
print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>
同
#!/usr/bin/php
<?php
print "Content-type: text/html\n\n";
$name="Matt";
$email="foo@bar.com";
print "<!DOCTYPE html>\n";
print "<html>\n<body>\n\nWelcome " . $name . "<br>\nYour email address is: " . $email . "\n\n</body>\n</html>";
?>
然后就可以了(在Safari和Chrome中复制)。 我想我的意思是服务器上似乎有两种php编译类型。 一个用于编译带有php扩展名的文本文件,另一个用于运行php脚本并将输出返回给客户端。
我想知道为什么会这样。 区别仅在于服务器吗? 我可以在命令行中将php文件作为输入传递给php编译器,并得到相似的结果,还是服务器正在执行一些我没看到的中间工作?
在我看来,您已经安装了 PHP作为CGI和Apache模块( mod_php5
)。
在这两种情况下,都需要PHP打开标记<?php
来使文件“工作”; 但是,这两种情况下的错误有所不同,CGI会为您提供内部服务器错误,而模块会将文件内容显示为HTML。
您可以通过安装mod_perl
为Perl文件重现类似的双重行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.