2024 年 PHP Conference Japan

Apache 函式

目錄

新增註記

使用者貢獻的註記 5 則註記

3
outofnet at mail dot ru
20 年前
提供給擁有數個虛擬主機的 Apache2 使用者的重要資訊。

當在 <VirtualHost> 區塊內使用 php_flag 指令時,它在 Apache 2 下的行為似乎與在 1.3 下不同。

如果您使用 php_flag 覆蓋其中一個虛擬主機的全局 php.ini 設定,那麼您的其他未自訂的虛擬主機也可能會使用這個覆蓋的設定。在單個 Apache 2 伺服器下,不同虛擬主機之間的 php_flag 記錄會混亂。這可能是由於 Apache 2 的多執行緒特性所導致。

以下是一個例子

假設您有兩個虛擬主機:V1 和 V2。
對於 Apache 設定中的 V1,您使用
php_flag magic_quotes_gpc 1
V2 應該使用全局 php.ini 設定,所以您沒有在 V2 的 Apache 設定中放入任何 php_flag 記錄(這在 Apache 1.3 下有效)。
而您的預設 php.ini 設定是
php_flag magic_quotes_gpc 0

當您執行伺服器時,您會注意到 V2 上的魔術引號(有時)被設定為開啟!
當先前有對 V1 的請求時,V2 上的值會變成開啟。

要解決這個問題,可以將 php_flag 移到位於自訂虛擬主機目錄內的 .htaccess 中,或者將具有預設設定的 php_flag 放入所有未自訂的 <VirtualHost> 區塊中。因此,對於 V2,請放入
php_flag magic_quotes_gpc 0

使用 php_flag engine 0 時務必非常小心。

我的設定是
PHP 4.3.4、Apache 2.0.50、Linux RedHat 9
2
henk_nicolai at REMOVE-THIS at hotmail dot com
22 年前
當有人輸入像 "http://my_server.nl/index.php/" 這樣的 URI 時,我的 Apache 伺服器會有問題。(請注意額外的斜線。)伺服器仍然會執行 index.php 指令碼,這會導致瀏覽器目錄和指令碼中使用的目前目錄不同。因此,我的相對連結無法正常運作,而且我的樣式表也未載入。快速測試("https://php.dev.org.tw/manual/en/index.php/")顯示這個網站也有這個問題。

當客戶端請求沒有最後一個斜線的目錄("https://php.dev.org.tw/manual")時,伺服器會傳送 HTTP 301(永久移動)回應,並重新導向到正確的 URI("https://php.dev.org.tw/manual/"),我的想法是在使用者新增太多斜線時也這樣做

<?php
$req
= $_SERVER['REQUEST_URI'];
// 移除多餘的部分。
$newReq = ereg_replace ('index.php[^?]*', 'index.php', $req);
if (
strlen($newReq) < strlen($req)) {
header ('Location: '.$newReq);
header ('HTTP/1.0 301 Moved Permanently');
die;
// 不要再輸出任何內容。
}
unset(
$req); unset($newReq);

... (
其餘程式碼) ...
?>

將所有出現的 'index.php' 替換成你的檔名就完成了。希望這有幫助。 :-)

(注意:我的 URI 中沒有使用片段(例如 'index.php#bottom'),如果您有使用片段,這段程式碼可能無法正常運作。)
-1
cjm2 at earthling dot net
22 年前
如果您正在嘗試尋找一個與 Apache 的 mod_mime 函式(例如 SetHandler)一起使用的處理器,請使用與 PHP 相關聯的 MIME 類型。

例如:SetHandler application/x-httpd-php
-2
bgshea at gmail dot com
19 年前
這是 henk_nicolai at REMOVE-THIS at hotmail dot com 程式碼的動態版本

$req = $_SERVER['REQUEST_URI'];
// 移除多餘的部分。
$newReq = ereg_replace ( $_SERVER['SCRIPT_NAME'] . '[^?]*', $_SERVER['SCRIPT_NAME'], $req);
if (strlen($newReq) < strlen($req))
{
header ('Location: '.$newReq);
header ('HTTP/1.0 301 Moved Permanently');
die; // 不要再輸出任何內容。
}
unset($req);
unset($newReq);

這可以放在任何要透過 URI 存取的檔案頂端。
-5
pike
19 年前
回覆 henk_nicolai

您描述的行為並不是 Apache 的「缺陷」:-) 。像
"http://my_server.nl/index.php/foo" 這樣的網址應該回傳資源 http://my_server.nl/index.php 並將 "/foo" 作為 PATH_INFO 傳遞到環境中。

如果您妥善運用,這會非常有用。

有關 PATH_INFO 和 PATH_TRANSLATED 的更多資訊,請參閱 http://nl2.php.net/reserved.variables。PATH_INFO 與 PHP 的 pathinfo() 函式無關。

$2c,
*pike
To Top