簡體   English   中英

將php5_module添加到apache服務器的復雜性

[英]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服務器並打開三個瀏覽器窗口並轉到它們各自的頁面,則它們看起來都是一樣的:

HTTP://localhost/welcome.php

(在Safari和Chrome中復制)

同樣,如果我打開三個瀏覽器窗口並轉到它們各自的文件系統資源,則它們看起來都相同:

三個文件系統文件的輸出相同

(在Safari和Chrome中復制)

但是,如果我隨后通過取消注釋啟用php:

#LoadModule php5_module libexec/apache2/libphp5.so

在我的httpd.conf文件中,重新啟動服務器並打開三個瀏覽器窗口,然后轉到它們各自的頁面,然后welcome.php更改為:

啟用通用服務器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>";
?>

如果我保存文件並重新啟動服務器,則會得到:

歡迎使用帶有php標簽的php文件

(在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>";

我仍然得到:

歡迎使用Perl解釋器注釋的Perl文件

(在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”目錄指令中,然后如果我重新啟動服務器,則會得到:

已啟用ExecCGI和perl CGI句柄的歡迎Perl文件

(在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM