2013-06-12 7 views
9

Próbuję przekazać zmienną środowiskową z .htaccess przez PHP. Działa to dobrze na moim lokalnym serwerze WAMP, ale na serwerze, na którym znajduje się moja witryna, nie udaje się to bez powodu.Zmienne środowiskowe nie są przekazywane od .htaccess do PHP

Oto moja konfiguracja testu:

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

Na moim lokalnego serwera, coraz test.php poprawnie zwraca:

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

Ale na serwer produkcyjny, zwraca:

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

Czego już wykluczyć:

  1. mod_env nie jest zainstalowane/włączone przez gospodarza. Nie może być, ponieważ wtedy SetEnv nie zostanie rozpoznany i dostanę 500 podczas przetwarzania .htaccess.

  2. AllowOverrides w httpd.conf dla tego katalogu nie obejmuje FileInfo. Nie może być, ponieważ wtedy Apache rzuciłby błąd "SetEnv nie jest tu dozwolony", gdy napotkał dyrektywę SetEnv, a ja znowu dostałbym 500.

  3. variables_order w php.ini nie obejmuje 'e'. To by wyjaśniało, że superglobalny $_ENV jest pusty (który jest), ale nie dlaczego getenv() nie zwraca wartości dla tych zmiennych.

  4. całego środowiska jest wkręca się. Nie można, ponieważ getenv('PATH') i getenv('SERVER_NAME') nadal zwracają prawidłowe wartości.

W tym momencie nie mam pojęcia, co może być przyczyną takiej konfiguracji.

Odpowiedz

6

Nie sądzę, stosując polecenie setenv normalnie pracuje w .htaccess. Jest to polecenie skryptu powłoki (bash, powłoki C itp.). Jeśli serwer robi support polecenie setenv według https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs trzeba mieć nazwę zmiennej początek z HTTP_.

+3

SetEnv _jest_ a. Htaccess, ale wykończyłeś go: kiedy wstępnie ustawiłem zmienną na HTTP_, wszystko działało. Nie widziałem tego wymogu udokumentowanego w jakimkolwiek "oficjalnym" źródle, co jest dziwne, ale hej, jeśli działa, nie dotykaj go, prawda? – nitwit

+1

To samo wymaganie wydaje się dotyczyć RewriteRule. * - (E = HTTP_VAR: VAL) na niektórych serwerach. – Chris

+0

wpadł na ten sam problem, tak dziwny, że nigdzie go nie udokumentowano. W moim przypadku tak się nie stało ze skryptem PHP, ale raczej w Perlu. – insaner

4

Jeśli korzystasz z domowego serwera na Macu lub masz włączoną funkcję suEXEC, istnieją środki bezpieczeństwa usuwające zdefiniowane zmienne środowiskowe inne niż http, dlatego nie będą wyświetlane w $ _ENV ['APPLICATION_ENV' ]. MOŻESZ jednak uzyskać do nich dostęp poprzez natywną funkcję PHP, aby uzyskać to samo.

$var = apache_getenv('APPLICATION_ENV'); 

Ta funkcja będzie żadnych zdefiniowaną zmienną środowiskową z SetEnv w pliku .htaccess lub dowolną zmienną środowiskową, która jest ustawiona w php.ini, nawet jeśli PHP usuwa je ze zmiennej $ _ENV.

Następnie można zdefiniować zmienną środowiskową w PHP, ale nie jest to zalecane.

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

Albo lepsze rozwiązanie: wystarczy zdefiniować globalny:

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

Gdy to zrobisz, to powinno działać zgodnie z oczekiwaniami.