2008-12-23 11 views
6

यहां एक समस्या है जिसे मैं हाल ही में चला रहा हूं - वेबहोस्ट पर एक गलत कॉन्फ़िगर किया गया अपाचे। इसका मतलब है कि सभी स्क्रिप्ट जो $_SERVER['DOCUMENT_ROOT'] ब्रेक पर भरोसा करते हैं। मैंने पाया है कि सबसे आसान कामकाज बस कुछ ग्लोबल में चर सेट सेट है जो साझा किया जाता है, लेकिन यह दर्द है इसे भूलना नहीं है। मेरा सवाल है, मैं प्रोग्रामिक रूप से सही दस्तावेज़ रूट कैसे निर्धारित करूं?PHP में दस्तावेज़ रूट को प्रोग्रामेटिक रूप से निर्धारित करने के लिए कैसे करें?

उदाहरण के लिए, एक मेजबान पर, सेटअप इस तरह है:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs' 

असली दस्तावेज़ जड़ें हैं:

test.example.com -> /data/htdocs/example.com/test 
www.example.com -> /data/htdocs/example.com/www 

और मैं एक स्क्रिप्ट है कि www.example.com/blog/ से चलाए जाने के दौरान चाहते हैं (पर पथ /data/htdocs/example.com/www/blog) /data/htdocs/example.com/www का सही मान प्राप्त करने के लिए।

एक और मेजबान पर, सेटअप थोड़ा अलग है:

$_SERVER['DOCUMENT_ROOT'] == '/srv' 
test.example.com -> /home/virtual_web/example.com/public_html/test 
www.example.com -> /home/virtual_web/example.com/public_html/www 

वहाँ इस के लिए किसी भी समाधान है? या केवल $_SERVER['DOCUMENT_ROOT'] पर भरोसा न करने का एकमात्र तरीका है और मैं अपने साइट पर चल रहे सभी सॉफ़्टवेयर को ठीक कर सकता हूं? होस्टिंग के पक्ष में इसे ठीक करना एक विकल्प प्रतीत नहीं होता है, मुझे अभी तक एक होस्ट का सामना करना पड़ेगा जहां यह सही तरीके से कॉन्फ़िगर किया गया था। मुझे सबसे अच्छा मिला एक दस्तावेज़ रूट www.example.com पर इंगित करता था, जो कम से कम open_basedir के अंदर था - उन्होंने अभी तक एक और नामकरण योजना का उपयोग किया था, www.example.com /u2/www/example_com/data/www/ पर इंगित करेगा।

उत्तर

2

पर http://www.helicron.net/php/ आधार पर हो सकता है:

$localpath=getenv("SCRIPT_NAME"); 
$absolutepath=getenv("SCRIPT_FILENAME"); 
$_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));  

मुझे बेसनाम/रीयलपाथ चाल को बदलना पड़ा क्योंकि यह मेरे मेजबान पर एक खाली स्ट्रिंग लौटा था। इसके बजाय, मैं SCRIPT_FILENAME का उपयोग करता हूं। यह शायद आईआईएस पर अब काम नहीं करेगा (लेकिन मूल स्क्रिप्ट जो $ _SERVER चर का उपयोग करती हैं शायद या तो नहीं)।

0

पीएचपी एक स्क्रिप्ट में है करने के लिए वर्तमान निर्देशिका की स्थापना की जानी चाहिए, इसलिए जब तक कि टूट आप $_SERVER['SCRIPT_FILENAME'] और getcwd() का उपयोग कर दस्तावेज़ जड़ यह पता लगाने में सक्षम होना चाहिए नहीं है। (मुझे अपने सिर के शीर्ष से सभी $ _SERVER vars याद नहीं हो सकते हैं, phpinfo() में कुछ और उपयोगी हो सकता है।)

+0

कुछ स्क्रिप्ट्स जिन्हें मैंने इंस्टॉल किया है वे "बहुत स्मार्ट" हैं और जानते हैं कि कौन सी निर्देशिका (सैद्धांतिक दस्तावेज़ रूट के सापेक्ष) में स्थापित हैं, और इसे दस्तावेज़ रूट (इसे डेटाबेस से प्राप्त करने के बाद) में संलग्न करें। निर्देशिकाओं को पट्टी करने के लिए मुझे अभी भी प्रत्येक निर्देशिका के लिए कोड को संशोधित करना होगा ... या नहीं? –

7

PHP5 में जादू स्थिर __FILE__ है जिसमें पूर्ण पथ होता है फ़ाइल जिसमें यह प्रतीत होता है। आप दस्तावेज़ रूट की गणना करने के लिए इसे नामकरण के साथ संयोजन में उपयोग कर सकते हैं।

आप एक कॉन्फ़िग फ़ाइल

define ('DOCUMENT_ROOT', dirname(__FILE__)); 

में निम्न में से एक की तरह एक बयान में रख सकते हैं इस चाल

+1

यह चाल फ़ाइल के पूर्ण नाम (या तो जादू निरंतर, या सर्वर वर्र्स से) का उपयोग कर रही थी और इसे SCRIPT_NAME से दस्तावेज़ रूट पर पूर्ण पथ के ज्ञान के साथ जोड़ती है। –

+3

PHP 5.3 से यह '__DIR__' भी है जिसका उपयोग' dirname (__ FILE __) 'के स्थिर में है। – Michael

+0

लेकिन यह सिर्फ वर्तमान फ़ाइल का फ़ोल्डर देता है जो वेबसर्वर का वास्तविक रूट फ़ोल्डर नहीं है। – Chuck

3

सभी स्क्रिप्ट को संशोधित करने की आवश्यकता नहीं है क्या करना चाहिए।

auto_prepend_file का उपयोग कर किसी भी स्क्रिप्ट को चलाने से पहले आप PHP फ़ाइल चला सकते हैं।

$_SERVER सिर्फ एक सरणी है, आप इसे संशोधित कर सकते हैं और सही $_SERVER['DOCUMENT_ROOT'] सेट कर सकते हैं।

+0

वह हर स्क्रिप्ट पर उस स्क्रिप्ट को चलाने के लिए बेकार है। – SchizoDuckie

+0

यह * हर * रन पर उस स्क्रिप्ट को चलाने के लिए बेकार है। इसे स्थापित करने के बजाय कुछ .htaccess के साथ बेहतर संभाल लें। – SchizoDuckie

+0

आप auto_prepend_file सेट करने के लिए .htaccess में php_value का उपयोग कर सकते हैं, लेकिन प्रश्न के लेखक ने आईआईएस सर्वर का उल्लेख किया था जो मुझे लगता है कि इसका समर्थन नहीं करता है। – Kornel

0

क्यों नहीं मांगें कि आपका वेबहोस्ट अपने सर्वर को सही तरीके से कॉन्फ़िगर करता है?

इस तरह की चीजें आपके कोड में चुपचाप रुकती रहती हैं और कभी भी सर्वर को ठीक नहीं होने तक कभी भी हटा नहीं जाती है (लेकिन फिर भी सक्रिय)। Thén सब कुछ तोड़ देगा।

या, अपनी सामग्री को होस्ट करने वाले होस्ट पर ले जाएं। यदि यह टूटा हुआ है, तो कौन जानता है कि आपको अगला क्या मिलेगा।

+0

मुझे यकीन नहीं है कि होस्ट को सही तरीके से कॉन्फ़िगर करना संभव है, यह mod_vhost_alias के साथ एक समस्या है (http://www.webmasterworld.com/apache/3640691.htm पर एक टिप्पणी के अनुसार)। –

2

यह एक कारण है कि लोग htaccess और/या क्वेरी स्ट्रिंग का उपयोग कर बूटस्ट्रैप /index.php के माध्यम से सब कुछ क्यों हटाते हैं। आप ऊपर उल्लिखित dirname(__FILE__) चाल का उपयोग कर सकते हैं और इस तरह अपने ऐप का सार्वजनिक आधार प्राप्त कर सकते हैं।

यदि आप एक ही प्रविष्टि बिंदु पर स्विच करने के लिए बहुत दूर हैं, तो मैंने जो कुछ देखा है, उनके पास एक स्क्रिप्ट है जो उनके स्क्रिप्ट के लिए एक सामान्य शीर्षलेख है जो एक निर्देशिका को खोजने के लिए निर्देशिका पेड़ को चलाता है जो अद्वितीय है आधार dir:

function findAppBase($dir) { 
    if(file_exists("$dir/unique_file.txt")) { 
     return $dir; 

    return findAppBase(dirname($dir)); 
} 

$base = findAppBase(dirname(__FILE__)); 

कि कोड का परीक्षण नहीं किया गया है, और $_ENV या $_SERVER में वार्स का उपयोग कर एक बरसाती कोट तरीका है कि आप क्या चाहते हैं क्या करेंगे ...

+0

शुक्र है, यह कोई समस्या नहीं है, मेरे पास केवल एक ही प्रविष्टि बिंदु है। यह सिर्फ इतना है कि मैं एक ही सॉफ्टवेयर को एकाधिक डोमेन और होस्ट पर चलाता हूं, और मुझे इसे प्रत्येक डोमेन के लिए ठीक करना होगा। मैं बजाय फिक्स अपस्ट्रीम सबमिट करना चाहता हूं इसलिए मुझे इसके बारे में परवाह नहीं है। –

संबंधित मुद्दे