2013-07-09 17 views
31

Sto provando a impostare una variabile di ambiente in un file .htaccess e recuperarla in PHP. Ho esaminato un sacco di altri thread qui su SO, ma tutto quello che ho provato finora ha fallito.Impostare una variabile di ambiente in .htaccess e recuperarla in PHP

ho aggiunto questa riga al file .htaccess:

SetEnv SPECIAL_PATH /foo/bin 

Ho provato il recupero di questo valore utilizzando la funzione PHP getenv():

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

ho runned phpinfo() per vedere l'elenco delle variabili d'ambiente disponibili, SPECIAL_PATH non c'è. Sono perplesso sul motivo per cui questo non funziona.

Grazie!

+1

Sei sicuro i file .htaccess sono attivati ​​per quella specifica directory? prova un'altra direttiva il cui effetto è facilmente verificabile. – goat

+1

questa altra domanda SO ti può aiutare? http://stackoverflow.com/questions/3780866/why-is-my-env-empty – luchosrock

risposta

23

Supponendo che la configurazione abbia AllowOverrides con .htaccess, è necessario abilitare mod_env in Apache perché funzioni.

Apache - mod_env

+0

Immagino che questo sia il problema. Sto cercando di capire come abilitare i moduli Apache (sono un newbie totale con qualsiasi cosa relativa al server), ma almeno ora so dove cercare. Grazie mille. –

+2

Ovunque si trovi il tuo httpd.conf, che di default è in genere "conf/httpd.conf" - cerca la riga '#LoadModule env_module modules/mod_env.so' e rimuovi #, quindi riavvia apache. –

6

Apache Docs su misura error.html copre variabili d'ambiente passati alla gestione degli errori pagine

dice "variabili d'ambiente REDIRECT_ vengono create dalle variabili d'ambiente che esistevano prima del reindirizzamento. Essi vengono rinominati con un prefisso REDIRECT_, ovvero, HTTP_USER_AGENT diventa REDIRECT_HTTP_USER_AGENT. "

Says "Nessuno di questi verrà impostato se il target ErrorDocument è un reindirizzamento esterno (qualsiasi cosa che inizi con un nome di schema come http :, anche se si riferisce allo stesso host del server)."

dice di SetEnv: "sono impostate le variabili d'ambiente interne stabilite dalla presente direttiva direttive di elaborazione richiesta dopo più presto vengono eseguiti, come il controllo degli accessi e URI-to-filename mappatura Se la variabile d'ambiente si sta impostando è destinata. come input in questa prima fase di elaborazione come la direttiva RewriteRule, dovresti invece impostare la variabile d'ambiente con SetEnvIf. "

Su alcuni server, variabili d'ambiente dall'utente dichiarato devono iniziare con 'HTTP_' per motivi di sicurezza, ad esempio: SetEnv HTTP_MY_VARIABLE "my value"

Ecco alcuni modi .htaccess di impostazione e l'utilizzo delle variabili di ambiente del server, preso dal mio modificare la deperibili Press 5G Blacklist/Firewall http://perishablepress.com/5g-blacklist-2013/ da usare l'ambiente di reporting variabile:

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> 

Avviso l'uso di paramters, ad esempio, $ 0 - 1% - 2%. % 0 fornisce la stringa completa,% 1 dà la corrispondenza della prima istruzione tra parentesi,% 2 la seconda. I trattini sono caratteri di visualizzazione letterali, per separare visivamente i risultati dei parametri (non pensare che sia un modo per inserire spazi all'interno).


Ecco alcuni metodi PHP per accedere alle variabili di ambiente (nel mio caso da 403.php e 404.php). Si noti che non si guarda in phpinfo(), ma in $ SERVER, e che le variabili ottiene con prefisso REDIRECT Si noti inoltre che con un 403/404 reindirizzamento, il QUERY_STRING diventa REDIRECT_QUERY_STRING Questa è roba che potrebbe facilmente dipende dal server, quindi controlla $ _SERVER per i tuoi valori effettivi.Ad esempio,

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"); 
} 

copro in profondità nel http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/

Problemi correlati