2013-06-12 12 views
9

Sto provando a passare una variabile d'ambiente da .htaccess a PHP. Funziona perfettamente sul mio server WAMP locale, ma sul server in cui è ospitato il mio sito Web, fallisce senza motivo.Le variabili d'ambiente non vengono passate da .htaccess a PHP

Ecco la mia configurazione di prova:

.htaccess:

SetEnv TEST_VARIABLE test_value 

test.php:

<pre> 
getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?> 

getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?> 
</pre> 

Sul mio server locale, ottenendo test.php correttamente restituisce:

getenv('TEST_VARIABLE') = test_value 
getenv('REDIRECT_TEST_VARIABLE') = 

Ma sul server di produzione, restituisce:

getenv('TEST_VARIABLE') = 
getenv('REDIRECT_TEST_VARIABLE') = 

cose che ho escludere:

  1. mod_env non è installato/attivato dall'host. Non può essere, perché quindi SetEnv non verrebbe riconosciuto e otterrei un 500 durante l'elaborazione di .htaccess.

  2. AllowOverrides in httpd.conf per questa directory non include FileInfo. Non può essere, perché quindi Apache avrebbe generato un errore "SetEnv non permesso qui" quando si incontrava la direttiva SetEnv e avrei avuto di nuovo un 500.

  3. variables_order in php.ini non include 'E'. Ciò spiegherebbe che il superglobale $_ENV è vuoto (che è), ma non perché getenv() non restituisce valori per queste variabili.

  4. L'intero ambiente è danneggiato. Non può essere, perché getenv('PATH') e getenv('SERVER_NAME') restituiscono ancora valori validi.

A questo punto non riesco a capire quale configurazione potrebbe causarlo.

risposta

6

Non penso che l'uso di setenv funzioni normalmente in .htaccess. È un comando di shell shell (bash, shell C, ecc.). Se il tuo server supporta il setenv, in base a https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs è necessario che il nome della variabile inizi con HTTP_.

+3

SetEnv _is_ un comando .htaccess, ma lo hai inchiodato: una volta prefisso la variabile con HTTP_, tutto funzionava. Non ho visto quel requisito documentato in nessuna fonte "ufficiale", il che è strano, ma hey, se funziona non toccarlo, giusto? – nitwit

+1

Lo stesso requisito sembra andare per RewriteRule. * - (E = HTTP_VAR: VAL) su alcuni server. – Chris

+0

ci siamo imbattuti in questo stesso problema, così strano che non è documentato da nessuna parte. Nel mio caso, questo non è accaduto con uno script PHP, ma piuttosto in Perl. – insaner

4

Se si sta eseguendo il server di casa su un Mac o se suEXEC è abilitato, esistono misure di sicurezza per rimuovere eventuali variabili di ambiente non http definite, pertanto non verranno visualizzate in $ _ENV ['APPLICATION_ENV' ]. È possibile, tuttavia, accedervi tramite una funzione PHP nativa per ottenere la stessa cosa.

$var = apache_getenv('APPLICATION_ENV'); 

Tale funzione permette di scaricare qualsiasi variabile d'ambiente definita con SetEnv nel file .htaccess, o qualsiasi variabile d'ambiente che viene impostata in php.ini, anche se PHP rimuove questi dalla variabile $ _ENV.

Si può quindi definire la variabile d'ambiente in PHP se lo si desidera, sebbene non sia raccomandato.

$_ENV['APPLICATION_ENV'] = apache_getenv('APPLICATION_ENV'); 

O la soluzione migliore: basta definire un globale:

define('APPLICATION_ENV', apache_getenv('APPLICATION_ENV')); 

Una volta fatto questo, dovrebbe funzionare, se lo desideri.

Problemi correlati