PHP में DOCUMENT_ROOT चर में असंगत स्लैश जब अपाचे का उपयोग कर


10

अलग सर्वर वातावरण में, PHP $_SERVER['DOCUMENT_ROOT']सुपर वैश्विक कभी कभी स्लैश है और कभी कभी यह नहीं करता है। मुझे लगा कि यह समस्या सीधे तौर पर संबंधित है कि अपाचे DocumentRootको httpd.confफाइल में कैसे परिभाषित किया गया है:

यानी मैंने सोचा होगा कि अगर httpd.confकोई पीछे नहीं हटता है:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

उसके बाद / var / www / लाइव / करंटecho $_SERVER['DOCUMENT_ROOT'] देना चाहिए

और अगर httpd.confस्लैश शामिल करता है:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

तब echo $_SERVER['DOCUMENT_ROOT']देना चाहिए / var / www / लाइव / वर्तमान /

उबंटू 10.04 पर यह मामला है, लेकिन आरएचईएल 5.5 पर एक अनुगामी स्लैश जोड़ा जाता है, $_SERVER['DOCUMENT_ROOT']भले ही अपाचे पर कोई भी परिभाषित नहीं किया गया हो।

किसी भी विचार क्यों ऐसा होता है? क्या कोई कॉन्फ़िगरेशन पैरामीटर है जो मुझे याद आ रहा है?


सन्दर्भ के लिए:

  • RHEL का PHP 5.3.3 (इश्यू होता है): PHP 5.3.3 (cli) (निर्मित: Jul 23 2010 16:26:53)
  • उबंटू का PHP संस्करण (कोई समस्या नहीं): सुहोसिन-पैच (cli) के साथ PHP 5.3.2-1ubuntu4.2 (निर्मित: 13 मई 2010 20:03:45)

जवाबों:


6

मुझे नहीं पता कि आपके वर्चुअल होस्ट के बीच स्लैश क्यों बदल रहा है। वैसे, क्या यह महत्वपूर्ण है? बस अपने कार्यक्रमों में एक नया स्लैश जोड़ें (निकालें यदि एक डबल स्लैश मौजूद है) और समस्या हल हो गई है।

मैं उपयोग करता हूं

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

4
आप बस उपयोग कर सकते हैं $realpath = realpath($_SERVER['DOCUMENT_ROOT']);। यह स्वचालित रूप से सभी एकाधिक स्लैश और भी अनुगामी को निकालता है। यदि आप हमेशा एक अनुगामी स्लैश चाहते हैं, तो उपरोक्त कॉल के परिणाम के लिए इसे संक्षिप्त करें realpath()। इसके अंदर नहीं।
फ्लू

1
कोई स्लैश (काफी हाल XAMPP स्थापित): मैं एक HostEurope मेजबान (उबंटू मुझे लगता है कि) के बीच एक ही मुद्दा (php 5.5) इस बात की पुष्टि कर सकते हैं: स्लैश है ... और विंडोज 7
फ्रैंक Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'उन सभी चीज़ों की तुलना में थोड़ा तेज़ होना चाहिए जो रियलपैथ कर सकते हैं।
फ्रैंक नॉक


3

एक अपाचे वातावरण में दस्तावेज़ जड़ एक से अधिक जगह में परिभाषित किया जा सकता।

हां, httpd.confइन सेटिंग्स को शामिल किया गया है, लेकिन उन्हें अधिलेखित किया जा सकता है क्योंकि यह फ़ाइल डिफ़ॉल्ट कॉन्फ़िगरेशन के लिए उपयोग की जाती है।

मैं तुम जाओ के तहत vhost विन्यास की जाँच सुझाव देंगे vhosts.dऔर sites-availableनिर्देशिका।


2

प्रस्तावित समाधान:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

सभी प्रतिष्ठानों में काम नहीं करता है।

उदाहरण के लिए, मेरे मामले में:

$_SERVER['DOCUMENT_ROOT']  = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"

पहले की तरह ही समस्या।

हो सकता है कि आप पहले निर्देश को संशोधित करें:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";

थीस्ल


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'उन सभी चीज़ों की तुलना में थोड़ा तेज़ होना चाहिए जो रियलपैथ कर सकते हैं।
फ्रैंक नॉक

2

डोम का जवाब इस मुद्दे का समाधान है, हालांकि स्टेफेनवेस्का का बयान यही कारण है कि विभिन्न वातावरणों में आप डबल '//' का अनुभव कर रहे हैं। अपने स्थानीय मशीन पर, अपने .conf फ़ाइल जहाँ आप अपना वर्चुअल होस्ट की स्थापना के भीतर, आप सबसे अधिक संभावना / परिभाषित दस्तावेज़ जड़ के अंत में कहा, जबकि जो व्यक्ति अपने अन्य वातावरण की स्थापना की विपरीत नहीं था, या इसके।

या तो, जब php के $ _SERVER ['DOCUMENT_ROOT'] का उपयोग करते समय आपको अपाचे पर्यावरण मूल्य मिलता है जो कॉन्फ़िगरेशन का परिणाम है। वह एक वातावरण में '/' और दूसरे में '//' का कारण है।


1

मैं कहूंगा कि यह माना जाता है कि DOCUMENT_ROOT में कोई अनुगामी स्लैश नहीं है।

यह मान वेब सर्वर कॉन्फ़िगरेशन से पारित किया गया है

अमरीका की एक मूल जनजाति

DocumentRoot /var/www/html

इसका मतलब है कि हमारे पास इसे जोड़ने के लिए एक प्रमुख स्लैश होना चाहिए।

यह जानते हुए कि मार्ग में कहीं भी एक डबल स्लैश '//' का कोई परिणाम नहीं है (जब फ़ाइल सिस्टम से संबंधित ... एक HTTP यूआरएल में, ऐसे मामले हो सकते हैं जहां कुछ गड़बड़ हैं)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

जब DOCUMENT_ROOT को स्लैश है हम कुछ नहीं परिणाम है कि पर सिस्टम प्रशासक को दोष कर सकते हैं :)

और उसे अनदेखा?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.