2010-11-29 2 views
6

배경

PHP/5.3.2를 설치 한 Apache/2.2.15 (Win32)가 인증을 처리하고 있습니다.PHP에서 아파치 환경 변수를 가져올 수 없습니다.

<Directory /usr/www/myhost/private> 
    # core authentication and mod_auth_basic configuration 
    # for mod_authn_dbd 
    AuthType Basic 
    AuthName "My Server" 
    AuthBasicProvider dbd 

    # core authorization configuration 
    Require valid-user 

    # mod_authn_dbd SQL query to authenticate a user 
    AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s" 
</Directory> 

인증이 정상적으로 작동합니다. 아무 문제 없습니다.

그러나 documentation에 관한은 여분의 필드는 환경에 AUTHENTICATION_fieldname 변수에 투입됩니다 다시 AuthDBDUserPWQuery에서 돌아왔다.

phpinfo()으로, 나는 "아파치 환경"에서 그는 올바른 값으로 이러한 변수를 볼 수 있습니다.

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS 내 PHP에서 해당 환경 변수를 가져올 수 없습니다

문제.

1 <?php 
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true); 
3 var_dump($Access); 
4 ?> 

3 호는 변수가 발견되지 않았 음을 나타내는 bool (false)을 인쇄합니다!
그러나 'HTTP_HOST'와 같은 다른 Apache 환경 변수로 변경하면 작동합니다.
.. 그리고 예, 나는 또한 getenv() 시도, 동일한 결과.

아파치 서버가 작동 4월 1.3.0 컴파일해야한다는 메모가있다. 나는 아파치 MSI는 httpd.apache.org에서 빌드를 사용하고 나는 그들이 PHP에서 액세스 할 수 있어야합니다 phpinfo()로 볼 수 있기 때문에 버전 2 위 연이율 컴파일 될 것으로 보인다.

+2

* [주석 :이 주석의 내용은 [개정 내역] (http://stackoverflow.com/posts/4308886/revisions)을 참조하십시오.] * 우리는 일반적으로 누군가의 영어에 대해 불을 붙이지 않습니다 좋음) 그리고 누군가를 빨아 들인 코드 형식이 아마도 그것을 잘 읽을 수 있도록 아마도 편집 할 것이기 때문이다. 또한 사람들이 google/rtfm에 google/rtfm이라고 들리는 곳이 아닙니다. 인터넷 검색을 사용하는 사람들이 답을 얻으 려 할 때 답을 얻을 수 있습니다. : p – ThiefMaster

+0

귀하의 질문에 대한 답변이 없지만 지금까지 보아온 최고의 구조적 질문에 대한 +1입니다. –

+0

완벽하게 유효한 질문입니다. 그렇게 방어 할 필요가 없습니다. :) RTFM 답변은 일반적으로 많은, * 많이 * 나쁜 (비) 질문에 예약되어 있습니다. – deceze

답변

1

나는 이것이 PHP의 버그가있을 것 같다 주위에 작업

했다. ... PHP 4에 대해보고 어떤 관련 버그를 발견하고 어쩌면 그들은 아직 해결되지 않은

I (나는 아파치 유저 데이터의 테이블에 액세스하는거야 때문에) 정말 싫어 솔루션을했지만 보인다

나는 선택의 여지가 없다.

//************************************************************* 
// If PHP failed to retrieve the AuthDBDUserPWQuery fields. 
// Connect to Apache authentication databaseand create the 
// envirnment variables manually 
// 
if (empty($_ENV['AUTHENTICATE_ACCESS'])) { 
    $Apache = mysql_connect('MyServerIP','MyUserName','MyPassword',false,MYSQL_CLIENT_SSL|MYSQL_CLIENT_COMPRESS); 
    mysql_select_db('MyDatabase',$Apache); 
    $SQLSet = mysql_query("SELECT Realm, Access FROM authenticationtable WHERE UserName='".$_SERVER['PHP_AUTH_USER']."' AND Password='".$_SERVER['PHP_AUTH_PW']."'"); 
    $SQLRow = mysql_fetch_array($SQLSet); 
    $_ENV['AUTHENTICATE_REALM'] = $SQLRow['Realm']; 
    $_ENV['AUTHENTICATE_ACCESS']= $SQLRow['Access']; 
    mysql_close($Apache); 
} 

PHP가 $ _ENV correct를 (를) 업데이트하지 못하면 Apache가 인증에 사용하는 것과 동일한 데이터베이스 및 테이블에서 현재 로그인 한 사용자를 검색합니다. 그런 다음 여분의 필드가 전역 $ _ENV 변수에 기록되므로 가정 한대로 사용할 수 있습니다. 나중에 "버그"가 수정되면 원래 $ _ENV가 자동으로 사용됩니다.

사람이이 주제에 대한 최신 정보를 일부를 가져올 수있는 경우에, 나는 행복 할 것 ...

+1

그리고 어떻게 이것이 다운 될 수 있습니까? 내 질문에 대한 해결책을 찾았고 다른 사람들이 볼 수 있도록 게시했습니다. 투표를하지 않으려면 이유를 적어주십시오. –

3

나는 $_SERVER['HTTP_AUTHORIZATION']에서 사용할 수있는 HTTP 권한 헤더 환경 변수를 만들기 위해 htaccess로 파일이 mod_rewrite는 규칙을 사용했다. 나는 이것이 당신의 목적에 맞춰질 수있을 것이라고 확신합니다. 확실하지가 최선의 해결책이다, 그러나 그것은 솔루션 의 경우 :

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last] 
+0

+1 시도 : 나는 당신이 제안한 것을 이해하기 위해 RewriteRule을 읽어야했다. 그러나 이것이 효과가있을 것이라고 나는 생각하지 않는다. 이 권리를 이해한다면 % {HTTP : Authorization}이 (가) HTTP 헤더에 이미 존재하고 정보를 Apache 환경에만 "복사"합니다. 필자의 경우 AuthDBDUserPWQuery는 SQL 문에서 각 추가 필드 (암호 뒤에)에 대해 "Apache 환경"변수를 만듭니다. 이 값은 다른 어느 곳에도 존재하지 않습니다. PHP에서 사전 정의 된 Apache 변수 만 검색 할 수있는 버그 일 수 있습니까? –

+0

@Max 흠, 나는 ... 나는 불행하게도 다른 것을 가지고 있지 않다. – deceze

0

는 deceze의 대답에 단서가있다.그는 $ _ENV 대신 $ _SERVER에서 데이터를 가져옵니다.

나는 메인을 httpd.conf에

SenEnv MY_VAR "true"를 가진 아파치 봉투 바르를 설정하고 $ _ENV에서 볼 수 없었다. 그것은 $ _SERVER에있었습니다.

0

최근 환경 변수에서 값을 가져 와서 PHP 데이터 유형을 구문 분석 할 라이브러리를 작성했습니다. 이 라이브러리는 환경 변수를 PHP 데이터 유형 (예 : integer, float, null, boolean)으로 구문 분석하고 JSON 문자열과 같은 복잡한 데이터 구조를 구문 분석하고 커뮤니티의 기여와 함께 더 많이 사용할 수 있습니다.

라이브러리는 여기에 있습니다 : 예에 의한 htaccess로와 https://github.com/jpcercal/environment

설정 환경 변수 :

SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var 

그리고 환경 변수에서 (독립적으로 환경의 가치 CLI, 아파치, Nginx에를 얻을 수 , PHP 내장 서버 및 기타) :

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

즐기십시오.