簡體   English   中英

在 .htaccess 中設置環境變量並在 PHP 中檢索它

[英]Set an environment variable in .htaccess and retrieve it in PHP

我正在嘗試在 .htaccess 文件中設置環境變量並在 PHP 中檢索它。 我已經在 SO 上瀏覽了一堆其他線程,但到目前為止我嘗試過的一切都失敗了。

我已將此行添加到 .htaccess 文件中:

SetEnv SPECIAL_PATH /foo/bin

我嘗試使用 getenv() PHP 函數檢索此值:

<?php $specialPath = getenv('SPECIAL_PATH'); ?>

我已經運行 phpinfo() 來查看可用環境變量的列表,但 SPECIAL_PATH 不存在。 我很困惑為什么這不起作用。

謝謝!

假設您的配置具有帶 .htaccess 的 AllowOverrides,您必須在 Apache 中啟用 mod_env 才能使其工作。

Apache - mod_env

Apache Docs custom-error.html 涵蓋傳遞給錯誤處理頁面的環境變量

說“REDIRECT_ 環境變量是從重定向之前存在的環境變量創建的。它們被重命名為 REDIRECT_ 前綴,即HTTP_USER_AGENT變為REDIRECT_HTTP_USER_AGENT 。”

說“如果 ErrorDocument 目標是外部重定向(任何以 http: 等方案名稱開頭的內容,即使它指的是與服務器相同的主機),這些都不會被設置。”

關於 SetEnv:“此指令設置的內部環境變量是在大多數早期請求處理指令運行后設置的,例如訪問控制和 URI 到文件名映射。如果您設置的環境變量是作為輸入到此在 RewriteRule 指令等早期處理階段,您應該使用 SetEnvIf 設置環境變量。”

在某些服務器上,出於安全目的,用戶聲明的環境變量必須以“HTTP_”開頭,例如: SetEnv HTTP_MY_VARIABLE "my value"

以下是一些 .htaccess 設置和使用服務器環境變量的方法,摘自我修改 Perishable Press 5G Blacklist/Firewall http://perishablepress.com/5g-blacklist-2013/以使用環境變量報告:

SetEnv myServerName %{SERVER_NAME}

RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L]

SetEnvIfNoCase User-Agent ^$ noUserAgent
SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1

<limit GET POST PUT>
  Order Allow,Deny
  Allow from all
  Deny from env=badUserAgent
</limit>

注意參數的使用,例如 $0--%1--%2。 %0 給出完整字符串,%1 給出第一個括號中的語句的匹配項,%2 給出第二個。 連字符是文字​​顯示字符,用於在視覺上分隔參數結果(不要認為是在其中放置空格的任何方法)。


這里有一些 PHP 訪問環境變量的方法(在我的例子中來自 403.php 和 404.php)。 請注意,您不是在 phpinfo() 中查看,而是在 $ SERVER 中查看,並且您的變量以 REDIRECT 為前綴請注意,使用 403/404 重定向時,QUERY_STRING 變為 REDIRECT_QUERY_STRING 這很容易依賴於服務器,因此檢查 $_SERVER 以獲得您的實際值。 例如,

if (getenv("HTTP_REFERER") !== FALSE) {
    $httpref = getenv("HTTP_REFERER");
} else {
    $httpref = '';
}
if (isset($_SERVER['REDIRECT_STATUS'])) {
    $status = $_SERVER['REDIRECT_STATUS'];
} else {
    $status = '';
}
if (isset($_SERVER['REMOTE_HOST'])) {
    $remoteHost = $_SERVER['REMOTE_HOST'];
} else {
    $remoteHost = '';
}

if (isset($_SERVER['REDIRECT_QUERY_STRING'])) {
    $querystring = $_SERVER['REDIRECT_QUERY_STRING'];
} else {
    $querystring = '';
}

if (isset($_SERVER['REDIRECT_noUserAgent']) ) {
    $htaccessErrors[] = 'NoUserAgent';
}
if (getenv("REDIRECT_badQueryString") !== FALSE) {
/* must exactly match what shows up in $_SERVER, is case sensitive (e.g. badQueryString not BadQueryString) */
    $htaccessErrors[] = 'badQueryString:'.getenv("REDIRECT_badQueryString");
}

我在http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/中進行了深入介紹

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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