[英]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.