2010-11-29 23 views
6

पृष्ठभूमि

में अपाचे वातावरण चर प्राप्त नहीं कर सकते मैं एक अपाचे/2.2.15 PHP/5.3.2 के साथ (Win32) की स्थापना की, प्रमाणीकरण से निपटने की है।पीएचपी

<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 करने के बारे में किसी भी अतिरिक्त क्षेत्र AuthDBDUserPWQuery से वापस पर्यावरण में एक AUTHENTICATION_fieldname चर में रखा जाएगा लौट आए।

phpinfo() के साथ, मैं इन चरों को "अपाचे पर्यावरण" के तहत सही मानों के साथ देख सकता हूं।

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

समस्या

मैं अपने php से उन वातावरण चर को नहीं लाया जा सकता है।

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

लाइन 3 प्रिंट bool (गलत) यह दर्शाता है कि चर नहीं मिला था!
हालांकि अगर मैं किसी अन्य अपाचे पर्यावरण चर जैसे 'HTTP_HOST' में बदलता हूं तो यह काम करता है।
.. और हाँ, मैंने getenv() भी कोशिश की है, वही परिणाम।

यह भी एक नोट है कि अपाचे सर्वर को काम करने के लिए एपीआर 1.3.0 के साथ संकलित करने की आवश्यकता है। मैंने Apache msi को httpd.apache.org से बनाया है और ऐसा लगता है कि यह संस्करण 2 के ऊपर एपीआर के साथ संकलित किया गया है। क्योंकि मैं उन्हें phpinfo() के साथ देख सकता हूं, उन्हें PHP से एक्सेस किया जाना चाहिए।

+2

* \ [♦ नोट: इस टिप्पणी के संदर्भ के लिए [संशोधन इतिहास] (http://stackoverflow.com/posts/4308886/revisions) देखें।] * हम आमतौर पर किसी के अंग्रेजी के बारे में ज्वाला नहीं करते हैं (आपका सुंदर है अच्छा) और यदि आपका कोड स्वरूपण किसी को चूसता है तो शायद इसे संपादित कर देगा ताकि यह अच्छी तरह से पठनीय हो। इसके अतिरिक्त एसओ वह जगह नहीं है जहां लोगों को Google/rtfm - googling/rtfming के बारे में बताया जाता है, जो लोग जवाब दे सकते हैं, क्योंकि वे ऐसा करने के लिए कह रहे हैं, इसके लिए इसके लिए प्रतिनिधि हैं, तो संभवतः -rep में परिणाम होगा। : पी – ThiefMaster

+0

मेरे पास आपके प्रश्न का कोई जवाब नहीं है, लेकिन मैंने कभी भी एसओ पर सबसे अच्छा संरचित प्रश्न रखने के लिए +1 किया है। –

+0

पूरी तरह से वैध सवाल, इतनी रक्षात्मक होने की आवश्यकता नहीं है। :) आरटीएफएम उत्तरों आमतौर पर अधिक, * अधिक * बदतर (गैर-) प्रश्नों के लिए आरक्षित होते हैं। – deceze

उत्तर

1

मैं चारों ओर एक काम है,

ऐसा लगता है कि यह एक PHP बग हो सकता है बनाया है। PHP 4 के लिए रिपोर्ट की गई कुछ संबंधित बग मिली और शायद उन्होंने उन्हें अभी तक तय नहीं किया है ...

मैंने ऐसा समाधान किया है जिसे मैं वास्तव में पसंद नहीं करता (क्योंकि मैं अपाचे उपयोगकर्ता डेटा तालिका तक पहुंच रहा हूं), लेकिन ऐसा लगता है कि मेरे पास कोई विकल्प नहीं है।

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

पीएचपी $ _ENV सही अद्यतन करने के लिए असफल हो गया है, तो यह वर्तमान में एक ही डेटाबेस और टेबल कि अपाचे प्रमाणीकरण के लिए उपयोग कर रहा है से उपयोगकर्ता द्वारा प्रवेश प्राप्त हो सकें। फिर अतिरिक्त फ़ील्ड वैश्विक $ _ENV चर में लिखे जाएंगे, इसलिए इसे माना जा सकता है। बाद में जब "बग" तय किया गया है, तो यह स्वचालित रूप से मूल $ _ENV का उपयोग करेगा।

किसी को भी इस विषय पर तारीख की जानकारी के लिए ऊपर कुछ ला सकता है, तो मैं खुशी होगी ...

+1

और यह कैसे नीचे हो सकता है?! मुझे अपने स्वयं के प्रश्न का समाधान मिला और इसे पोस्ट किया ताकि अन्य लोग इसे देख सकें। यदि आप वोट डाउन करने जा रहे हैं, तो कृपया बताएं क्यों?! –

3

मैंने $_SERVER['HTTP_AUTHORIZATION'] में HTTP प्राधिकरण शीर्षलेख पर्यावरण चर उपलब्ध कराने के लिए .htaccess फ़ाइल में इस mod_rewrite नियम का उपयोग किया है। मुझे यकीन है कि यह आपके उद्देश्यों के लिए अनुकूलित किया जा सकता है। सुनिश्चित नहीं हैं कि अगर यह सबसे अच्छा समाधान है, लेकिन यह एक समाधान है:

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

+1 कोशिश करने के लिए +1: डी को मैंने जो सुझाव दिया है उसे समझने के लिए मुझे रिवाइट्रूल पर पढ़ना पड़ा। लेकिन मुझे नहीं लगता कि यह काम करेगा। अगर मैं समझता हूं कि यह सही% {HTTP: प्रमाणीकरण} आपके HTTP शीर्षलेख में पहले से मौजूद है और आप केवल अपाचे वातावरण में जानकारी को "कॉपी" करते हैं। मेरे मामले में AuthDBDUserPWQuery SQL कथन से प्रत्येक अतिरिक्त फ़ील्ड (पासवर्ड के बाद) के लिए "अपाचे पर्यावरण" चर बनाता है। ये मान कहीं और मौजूद नहीं हैं। क्या यह PHP में एक बग हो सकता है जो केवल पूर्वनिर्धारित अपाचे चर को पुनर्प्राप्त किया जा सकता है? –

+0

@ मैक्स हम्म, मैं देखता हूं ... दुर्भाग्यवश मेरे पास कुछ और नहीं है। – deceze

0

deceze के जवाब में एक सुराग नहीं है।वह $ _ENV के बजाय $ _SERVER से डेटा ला रहा है।

मैं मुख्य httpd.conf में साथ

SenEnv MY_VAR "सही" एक अपाचे पर्यावरण वार की स्थापना की गई थी और यह $ _ENV में नहीं देख सकता था। हालांकि यह $ _SERVER में था।

0

हाल ही में मैंने पर्यावरण चर से मूल्य प्राप्त करने और PHP डेटा प्रकारों को पार्स करने के लिए एक लाइब्रेरी लिखी है। इस लाइब्रेरी का उपयोग पीएचपी डेटा प्रकारों (जैसे पूर्णांक, फ्लोट, नल, बूलियन के लिए कास्टिंग) में पर्यावरण चर को पार्स करने के लिए किया जा सकता है, एक JSON स्ट्रिंग जैसे जटिल डेटा स्ट्रक्चर और अधिकतर योगदान के योगदान के साथ पार्स का विश्लेषण करें।

पुस्तकालय यहाँ उपलब्ध है: https://github.com/jpcercal/environment

सेटअप .htaccess के साथ अपने वातावरण चर उदाहरण के द्वारा:

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")); 

इसका आनंद लें।