2013-06-12 2 views
9

.htaccess에서 PHP로 환경 변수를 전달하려고합니다. 이것은 내 로컬 WAMP 서버에서 정상적으로 작동하지만 내 웹 사이트가 호스팅되는 서버에서는 이유없이 실패합니다.환경 변수가 .htaccess에서 PHP로 전달되지 않습니다.

여기 내 테스트 구성입니다 :

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> 

제대로 test.php 점점 반환

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

하지만 프로덕션 서버, 그것은 반환

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

것들 내가 배제했습니다

  1. mod_env이 호스트에 의해 활성화/설치되어 있지 않습니다. 수 없다. 왜냐하면 SetEnv이 인식되지 않을 것이고 .htaccess를 처리하는 동안 500을 얻게 될 것이기 때문이다.

  2. AllowOverrideshttpd.conf에는 FileInfo이 포함되지 않습니다. 수 없다면, 아파치는 SetEnv 지시어를 만나면 "SetEnv not allowed here"라는 오류를 던져서 다시 500을 얻게 될 것이기 때문입니다.

  3. variables_order의 'php.ini'에는 'E'가 포함되지 않습니다. 이 경우 $_ENV superglobal이 비어있는 것으로 설명되지만 (이유는 없습니다) getenv()이이 변수에 대한 값을 반환하지 않습니다.

  4. 전체 환경이 엉망입니다. getenv('PATH')getenv('SERVER_NAME')이 여전히 올바른 값을 반환하기 때문에 사용할 수 없습니다.

이 시점에서 나는 어떤 구성이이 문제를 일으킬 수 있는지에 대해 망설였습니다.

답변

6

setenv를 사용하는 것이 .htaccess에서 정상적으로 작동한다고 생각하지 않습니다. 이것은 쉘 스크립트 명령 (bash, C 쉘 등)입니다. 서버 을 지원하는 경우 에 따라 http_로 시작하는 변수 이름을 지정해야합니다.

+3

SetEnv _is_ .htaccess 명령,하지만 당신은 못했습니다 : 일단 내가 변수 앞에 HTTP_ 접두사, 모든 것이 효과가있다. 그 요구 사항이 이상한 "공식"소스에 문서화되어있는 것을 보지 못했지만 작동하는 경우 만지지는 않습니다. 맞습니까? – nitwit

+1

일부 서버에서는 RewriteRule. * - (E = HTTP_VAR : VAL)과 동일한 요구 사항이 적용됩니다. – Chris

+0

이 문제가 발생하여 어디서나 문서화되지 않은 것이 이상합니다. 필자의 경우 PHP 스크립트에서는 발생하지 않지만 Perl에서는 발생합니다. – insaner

4

Mac에서 홈 서버를 실행하거나 suEXEC를 사용하는 경우 정의 된 비 http 환경 변수를 제거 할 수있는 보안 조치가 있으므로 $ _ENV [ 'APPLICATION_ENV' ]. 그러나 네이티브 PHP 함수를 통해 동일한 작업을 수행 할 수 있습니다.

$var = apache_getenv('APPLICATION_ENV'); 

이 함수는 PHP는 $ _ENV 변수에서 다음을 제거하더라도, 당신의 .htaccess 파일에 그러나 SetEnv와 정의 된 환경 변수, 또는 php.ini 파일에 설정되어있는 환경 변수를 얻을 것이다.

원하는 경우 PHP 내에서 환경 변수를 정의 할 수 있지만 권장하지는 않습니다.

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

또는 더 나은 솔루션 : 단지 전역을 정의 : 당신이 그렇게하면 원하는대로

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

, 그것은 작동합니다.

관련 문제