2010-11-29 19 views
6

Tło

Mam Apache/2.2.15 (Win32) PHP/5.3.2 skonfigurowaniu obsługi uwierzytelniania.Nie można pobrać zmienne środowiskowe Apache 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> 

Uwierzytelnianie działa dobrze! Bez problemów.

Ale odnośnie do documentation każde dodatkowe pole powrócił z AuthDBDUserPWQuery będzie umieścić w AUTHENTICATION_fieldname zmiennej w środowisku.

Z phpinfo() widzę te zmienne z poprawnymi wartościami w "Środowisku Apache".

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

Problem

Nie mogę pobrać te zmienne środowiskowe z mojego php.

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

Linia 3 drukuje bool (false), wskazując, że zmienna nie została znaleziona!
Jednak jeśli zmienię na inną zmienną środowiskową Apache, taką jak "HTTP_HOST", działa.
..i tak, próbowałem również getenv(), ten sam wynik.

Istnieje również notatka, że ​​serwer Apache musi zostać skompilowany z APR 1.3.0 do pracy. Użyłem Apsy msi build z httpd.apache.org i wydaje się, że jest skompilowany z APR powyżej wersji 2. Ponieważ widzę je z phpinfo() muszą być dostępne z PHP.

+2

* \ [♦ uwaga: Zobacz [historia wersji] (http://stackoverflow.com/posts/4308886/revisions) dla kontekstu tego komentarza.] * Zwykle nie palimy się o czyimś angielskim (twój jest ładny dobrze) i jeśli twoje formatowanie kodu zostało zasysane, ktoś prawdopodobnie edytowałby to, by było dobrze czytelne. Dodatkowo SO nie jest miejscem, w którym ludzie są proszeni do google/rtfm - googling/rtfming jest tym, co ludzie, którzy mogą odpowiadać, gdy dostaną + powtórzenia za to, podczas gdy mówienie, że to zrobi, najprawdopodobniej zaowocuje opcją -rep. : p – ThiefMaster

+0

Nie mam żadnych odpowiedzi na twoje pytanie, ale +1 za posiadanie najlepiej zorganizowanego pytania, jakie kiedykolwiek widziałem na SO. –

+0

Idealnie ważne pytanie, nie trzeba być tak defensywnym. :) Odpowiedzi RTFM są zwykle zarezerwowane na wiele, * dużo * gorszych (nie) pytań. – deceze

Odpowiedz

1

zrobiłem pracę wokół

Wydaje się, że może to być błąd PHP. Znaleziono kilka powiązanych błędów zgłoszonych dla PHP 4 i być może ich jeszcze nie naprawiły ...

Zrobiłem rozwiązanie, którego naprawdę nie lubię (ponieważ mam dostęp do tabeli danych użytkownika Apache), ale wydaje się że nie mam wyboru.

//************************************************************* 
// 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); 
} 

Jeśli PHP nie udało się zaktualizować $ _ENV poprawne, to będzie pobierać prąd zalogowany użytkownik z tej samej bazy danych i tabeli, że Apache jest przy użyciu uwierzytelniania. Następnie dodatkowe pola zostaną zapisane w globalnej zmiennej $ _ENV, aby można było używać jej zgodnie z założeniami. Później, gdy "błąd" zostanie naprawiony, automatycznie użyje oryginału $ _ENV.

Jeśli ktoś może przynieść aktualne informacje na ten temat, byłbym szczęśliwy ...

+1

A jak to się nie uda?!? Znalazłem rozwiązanie dla mojego questione i opublikowałem to, aby inni mogli to zobaczyć. Jeśli zamierzasz głosować, proszę podać dlaczego?!? –

3

Użyłem tej reguły mod_rewrite w pliku .htaccess, aby udostępnić zmienną środowiskową nagłówka autoryzacji HTTP w $_SERVER['HTTP_AUTHORIZATION']. Jestem pewien, że można to dostosować do twoich celów. Nie jestem pewien, czy jest to najlepsze rozwiązanie, ale to rozwiązanie:

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

+1 za próbę: D Musiałem przeczytać na RewriteRule, aby zrozumieć, co zasugerowałeś. Ale nie sądzę, że to zadziała. Jeśli rozumiem to prawo% {HTTP: Authorization} jest już obecne w nagłówku HTTP i tylko "kopiujesz" informacje do środowiska Apache. W moim przypadku AuthDBDUserPWQuery tworzy zmienne "Apache environment" dla każdego dodatkowego pola (po haśle) z instrukcji SQL. Wartości te nie występują nigdzie indziej. Czy może to być błąd w PHP, że tylko wstępnie zdefiniowane zmienne Apache mogą być pobierane? –

+0

@Max Hmm, rozumiem ... Nie mam nic więcej, niestety. – deceze

0

Jest trop w odpowiedzi deceze użytkownika.Wyszukuje dane z $ _SERVER zamiast $ _ENV.

byłem ustawienie Apache Env Var z

SenEnv MY_VAR "true" w głównym httpd.conf i nie widział go w $ _ENV. Było to jednak w $ _SERVER.

0

Ostatnio napisałem bibliotekę, aby pobrać wartości ze zmiennych środowiskowych i przeanalizować typy danych PHP. Ta biblioteka może być używana do analizowania zmiennych środowiskowych do typów danych PHP (takich jak casting to integer, float, null, boolean), analizowania złożonych struktur danych, takich jak ciąg JSON i więcej, z udziałem społeczności.

Biblioteka jest dostępna tutaj: https://github.com/jpcercal/environment

konfiguracji zmiennych środowiskowych z .htaccess przykładem:

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

i uzyskać wartości od zmiennej środowiskowej (niezależnie od środowiska CLI, Apache, nginx , Wbudowany serwer PHP i inne), aby to zrobić:

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

Ciesz się tym.

Powiązane problemy