वर्तमान डोमेन प्राप्त करें


140

सर्वर पर मेरी साइट है

http://www.myserver.uk.com

इसके लिए मेरे पास दो डोमेन हैं,

http://one.com

तथा

http://two.com

मैं PHP वर्तमान डोमेन के साथ मिलना चाहूंगा, लेकिन अगर मैं उपयोग करता हूं $_SERVER['HTTP_HOST']तो यह मुझे दिखाएगा

myserver.uk.com

के बजाय:

one.com or two.com

मैं डोमेन कैसे प्राप्त कर सकता हूं, सर्वर नाम नहीं?

मेरा PHP संस्करण 5.2 है।


आप केवल प्राथमिक URl प्राप्त कर सकते हैं। उन तीन में से कौन सा प्राथमिक है?
कोड स्पाई

2
आपके सर्वर पर आपके दो डोमेन 'पुनर्निर्देशन' का अनुरोध कैसे करते हैं?
xiaofeng.li

1
@infgeoax शायद एक फ्रेम ...
कोडकास्टर

प्राथमिक myserver.uk.com है। तो मुझे वर्तमान डोमेन नाम कैसे मिल सकता है? अगर मैं पता one.com के साथ साइट खोलता हूं, तो मुझे myserver.uk.com के बजाय one.com मिल जाएगा
टोनी ईवीकेट

@TonyEvyght वह बिंदु इन्फ़ैक्सो है और मैं बनाने की कोशिश करता हूं, आपको वह होस्ट नाम मिलना चाहिए , जिससे आप जुड़ रहे हैं $_SERVER['HTTP_HOST']। यदि साइटें one.comऔर two.com(i) फ्रेम का उपयोग करके "पुनर्निर्देशित" कर रही हैं, तो पेज अभी भी myserver.uk.com से आता है, इसलिए आपको असली डोमेन नहीं मिलेगा। HTML स्रोत किस लिए है one.com?
कोडकेस्टर

जवाबों:


175

इसका उपयोग करके देखें: $_SERVER['SERVER_NAME']

या तोता

$_SERVER['REQUEST_URI']

apache_request_headers ()


23
-1: अकेले इस जवाब के साथ, मुझे नहीं पता कि मैं जो अलग-अलग सुझाव दे रहा हूं, वे क्या कर रहे हैं। ज़रूर, यह मुझे देखने का एक बिंदु देता है, लेकिन अपने आप से यह वास्तव में एक अच्छा जवाब नहीं है ...
जैस्पर

4
बस Print_r (apache_request_headers ()) और आप सभी को समझ जायेंगे :)
onehalf

2
@SarahLewis HTTP_X_ORIGINAL_HOSTको उपयोगकर्ता द्वारा संशोधित किया जा सकता है, और उस पर भरोसा नहीं किया जा सकता है। यह हमेशा एक समस्या नहीं हो सकती है, लेकिन इसके बारे में जागरूक होना कुछ है।
wp-overwatch.com

64

सबसे अच्छा उपयोग होगा

echo $_SERVER['HTTP_HOST'];

और इसका उपयोग इस तरह किया जा सकता है:

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

नीचे दिया गया यह कोड $ _SERVER में सभी चरों को देखने के लिए एक अच्छा तरीका है, जो संरचित HTML आउटपुट में आपके खोजशब्दों को उजागर करता है, जो सीधे निष्पादन के बाद रुकता है। चूंकि मैं कभी-कभी यह भूल जाता हूं कि कौन सा खुद का उपयोग करना है - मुझे लगता है कि यह शून्य हो सकता है।

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>

39

का उपयोग कर $_SERVER['HTTP_HOST']मुझे (उपडोमेन।) Maindomain.extension प्राप्त होता है। यह मुझे सबसे आसान उपाय लगता है।

यदि आप वास्तव में iFrame के माध्यम से 'पुनर्निर्देशित' कर रहे हैं, तो आप एक GET पैरामीटर जोड़ सकते हैं जो डोमेन बताता है।

<iframe src="myserver.uk.com?domain=one.com"/>

और फिर आप एक सत्र चर सेट कर सकते हैं जो आपके आवेदन के दौरान इस डेटा को बनाए रखता है।


1
ज्यादातर महत्वपूर्ण रूप से इसमें पोर्ट नंबर शामिल होता है ताकि मुझे बाद में इसे संक्षिप्त करने की आवश्यकता न हो। bsdnoobz द्वारा सुझाया गया phpinfo मुझे सही समाधान खोजने में मदद करता है।

30

ऐसा करने का एकमात्र सुरक्षित तरीका है

इस पृष्ठ के अन्य सभी उत्तरों में सुरक्षा निहितार्थ हैं जिनके बारे में आपको जानकारी होनी चाहिए।

वर्तमान डोमेन को पुनर्प्राप्त करने की एकमात्र गारंटीकृत सुरक्षित विधि करने के लिए है 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯 𝓲𝓷 𝓲𝓽 𝓼𝓽𝓸𝓻𝓮।

अधिकांश फ्रेमवर्क आपके लिए डोमेन स्टोर करने का ध्यान रखते हैं, इसलिए आप अपने विशेष ढांचे के लिए प्रलेखन से परामर्श करना चाहेंगे। यदि आप एक फ्रेमवर्क का उपयोग नहीं कर रहे हैं, तो निम्न स्थानों में से एक में डोमेन को संग्रहीत करने पर विचार करें:

+ ------------------------------------------------- --- + ----------------------------------- +
 | डोमेन के भंडारण के सुरक्षित तरीके | द्वारा प्रयुक्त |
+ ------------------------------------------------- --- + ----------------------------------- +
 | एक विन्यास फाइल | जुमला, द्रुपाल / सिम्फनी |
 | डेटाबेस | वर्डप्रेस |
 | एक पर्यावरण चर | लारवेल |
 | एक सेवा रजिस्ट्री | कुबेरनेट्स डीएनएस |
+ ------------------------------------------------- --- + ----------------------------------- +


आप निम्नलिखित का उपयोग कर सकते हैं ... लेकिन वे असुरक्षित हैं

हैकर्स इन वैरिएबल को आउटपुट बना सकते हैं, जो भी डोमेन वे चाहते हैं। यह कैश पॉइज़निंग और मुश्किल से ध्यान देने योग्य फ़िशिंग हमलों को जन्म दे सकता है।

$_SERVER['HTTP_HOST']

यह अनुरोध हेडर से डोमेन प्राप्त करता है जो हैकर्स द्वारा हेरफेर करने के लिए खुला है । के जैसा:

$_SERVER['SERVER_NAME']

यदि एपेक सेटिंग usecanonicalname बंद है तो इसे बेहतर बनाया जा सकता है; जिस स्थिति में $_SERVER['SERVER_NAME']अब उन्हें मनमाने मूल्यों के साथ आबाद होने की अनुमति नहीं दी जाएगी और वे सुरक्षित रहेंगे। यह, हालांकि, गैर-डिफ़ॉल्ट और सेटअप का सामान्य नहीं है।


लोकप्रिय प्रणालियों में

नीचे आप निम्न रूपरेखाओं / प्रणालियों में वर्तमान डोमेन कैसे प्राप्त कर सकते हैं:

वर्डप्रेस

$urlparts = parse_url(home_url());
$domain = $urlparts['host'];

आप वर्डप्रेस में एक यूआरएल का निर्माण कर रहे हैं, बस का उपयोग HOME_URL या SITE_URL , या के किसी भी अन्य URL कार्यों

Laravel

request()->getHost()

request()->getHostसमारोह Symfony से विरासत में मिला है, और सुरक्षित कर दिया गया है के बाद से 2013 CVE-2013-4752 समझौता किया गया था।

Drupal

इंस्टॉलर अभी तक इसे सुरक्षित बनाने का ध्यान नहीं रखता ( # 2404259 जारी करता है )। लेकिन Drupal 8 में प्रलेखन है जिसे आप अपने Drupal स्थापना को सुरक्षित करने के लिए विश्वसनीय होस्ट सेटिंग्स पर अनुसरण कर सकते हैं जिसके बाद निम्न का उपयोग किया जा सकता है:

\Drupal::request()->getHost();

अन्य ढांचे

अपने पसंदीदा ढांचे में वर्तमान डोमेन को कैसे शामिल करें, इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। ऐसा करते समय, कृपया संबंधित स्रोत कोड या किसी अन्य चीज़ के लिए एक लिंक शामिल करें जो मुझे यह सत्यापित करने में मदद करेगा कि फ्रेमवर्क सुरक्षित रूप से काम कर रहा है।




परिशिष्ट

शोषण के उदाहरण:

  1. यदि कोई बॉटनेट लगातार गलत होस्ट हेडर का उपयोग करके पेज का अनुरोध करता है, तो कैश पॉइज़निंग हो सकती है। परिणामी HTML में फिर हमलावर वेबसाइट के लिंक शामिल होंगे जहां वे आपके उपयोगकर्ताओं को फ़िश कर सकते हैं। सबसे पहले दुर्भावनापूर्ण लिंक केवल हैकर को वापस भेजे जाएंगे, लेकिन यदि हैकर पर्याप्त अनुरोध करता है, तो पृष्ठ का दुर्भावनापूर्ण संस्करण आपके कैश में समाप्त हो जाएगा, जहां इसे अन्य उपयोगकर्ताओं को वितरित किया जाएगा।

  2. यदि आप होस्ट हेडर के आधार पर डेटाबेस में लिंक स्टोर करते हैं तो फ़िशिंग हमला हो सकता है। उदाहरण के लिए, मान लें कि आप किसी फ़ोरम में उपयोगकर्ता के प्रोफ़ाइल के लिए निरपेक्ष URL संग्रहीत करते हैं। गलत हेडर का उपयोग करके, एक हैकर को कोई भी व्यक्ति मिल सकता है जो फ़िशिंग साइट पर भेजे जाने के लिए अपने प्रोफ़ाइल लिंक पर क्लिक करता है।

  3. पासवर्ड रीसेट पॉइज़निंग तब हो सकती है जब एक हैकर किसी अन्य उपयोगकर्ता के लिए पासवर्ड रीसेट फॉर्म भरते समय एक दुर्भावनापूर्ण होस्ट हेडर का उपयोग करता है। तब उपयोगकर्ता को एक पासवर्ड रीसेट लिंक वाली एक ईमेल मिलेगी जो फ़िशिंग साइट की ओर ले जाती है।

  4. यहाँ कुछ और दुर्भावनापूर्ण उदाहरण हैं

अतिरिक्त कैविट्स और नोट्स:

  • जब usecanonicalname बंद हो जाता है तो $_SERVER['SERVER_NAME']उसी हेडर के साथ पॉपुलेट $_SERVER['HTTP_HOST']किया जाता है जो वैसे भी (प्लस पोर्ट) का उपयोग करता था। यह अपाचे का डिफ़ॉल्ट सेटअप है। यदि आप या देवोप्स इसे चालू करते हैं, तो आप ठीक हैं - ish - लेकिन क्या आप वास्तव में एक अलग टीम पर भरोसा करना चाहते हैं, या भविष्य में खुद को तीन साल, यह देखना है कि गैर-मामूली विन्यास क्या होगा -डिफ़ॉल्ट मान? हालांकि यह चीजों को सुरक्षित बनाता है, फिर भी मैं इस सेटअप पर भरोसा करने से बचता हूं।
  • रेडहैट, हालांकि, डिफ़ॉल्ट रूप से [ स्रोत ] द्वारा usecanonical को चालू करता है ।
  • यदि वर्चुअल होस्ट प्रविष्टि में सर्वरएलाइज़ का उपयोग किया जाता है, और उपनामित डोमेन का अनुरोध किया जाता है, $_SERVER['SERVER_NAME']तो वर्तमान डोमेन वापस नहीं करेगा, लेकिन सर्वरनाम निर्देश का मान लौटाएगा।
  • यदि सर्वरनाम को हल नहीं किया जा सकता है, तो ऑपरेटिंग सिस्टम के होस्टनाम कमांड का उपयोग इसके स्थान [स्रोत] में किया जाता है ।
  • यदि होस्ट हेडर को छोड़ दिया जाता है, तो सर्वर ऐसा व्यवहार करेगा मानो usecanonical [स्रोत] पर है
  • अंत में, मैंने सिर्फ अपने स्थानीय सर्वर पर इसका उपयोग करने की कोशिश की, और मेजबानों के हेडर को खराब करने में असमर्थ था। मुझे यकीन नहीं है कि अगर अपाचे के लिए एक अपडेट था जिसने इसे संबोधित किया था, या अगर मैं सिर्फ कुछ गलत कर रहा था। इसके बावजूद, यह हैडर अभी भी उन वातावरणों में शोषक होगा जहां वर्चुअल होस्ट का उपयोग नहीं किया जा रहा है।

लिटिल रैंट:

     इस सवाल को हाथ में सुरक्षा समस्याओं के एक भी उल्लेख के बिना सैकड़ों हजारों विचार मिले! यह इस तरह नहीं होना चाहिए, लेकिन सिर्फ इसलिए कि एक स्टैक ओवरफ्लो उत्तर लोकप्रिय है, इसका मतलब यह नहीं है कि यह सुरक्षित है।




1
आप home_url और site_url के बीच अंतर का उल्लेख करना चाह सकते हैं। wordpress.stackexchange.com/a/50605/13
Volomike

1
वर्डप्रेस उपयोगकर्ताओं के लिए +1। अच्छा है अगर आपको उपडिर में स्थापित करने के लिए जांच करने की आवश्यकता है, लेकिन ध्यान दें कि parse_url कुंजी: $urlparts['path']डोमेन के रूट निर्देशिका में स्थापित होने पर सेट नहीं है। और $urlparts['path']उपनिर्देशिका वापस आती है।
जोनास लुंडमैन

9

कोशिश करो $_SERVER['SERVER_NAME']

टिप्स: एक PHP फ़ाइल बनाएं जो फ़ंक्शन को कॉल करती है phpinfo()और "PHP चर" अनुभाग देखें। वहाँ उपयोगी चर का एक गुच्छा रहे हैं हम वहाँ के बारे में कभी नहीं सोचते हैं।


आप हमेशा $ _SERVER और खोज

3

मुझे पता है कि यह पूरी तरह से इस विषय पर नहीं हो सकता है, लेकिन मेरे अनुभव में, मुझे वर्तमान URL का डब्ल्यूडब्ल्यूडब्ल्यू-नेस एक चर में उपयोगी है।

संपादित करें: इसके अलावा, कृपया मेरी टिप्पणी नीचे देखें, यह देखने के लिए कि यह क्या हो रहा है।

यह निर्धारित करना महत्वपूर्ण है कि अजाक्स कॉल को "www" के साथ भेजा जाए या नहीं:

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

जब एक अजाक्स कॉल भेज रहा है तो डोमेन नाम ब्राउज़र के एड्रेस बार में मेल खाना चाहिए, अन्यथा आपके पास कंसोल में अनकॉन्ड सिक्योरिटीइरर होगा ।

इसलिए मैं इस मुद्दे को हल करने के लिए इस समाधान के साथ आया:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

फिर, इस आधार पर कि क्या $ डब्ल्यूडब्ल्यूडब्ल्यू सच है, या गलत अजाक्स कॉल को चलाते हैं।

मुझे पता है कि यह तुच्छ लग सकता है, लेकिन यह एक ऐसी आम समस्या है, जिस पर यात्रा करना आसान है।


ओपी ने स्पष्ट रूप से डोमेन के लिए कहा, न कि SERVER_NAME
सेबस्टियन जी। मरीनस्कु

सच है, लेकिन इन दिनों आपको www मुद्दे के बारे में भी चिंता करनी होगी।
InfiniteStack

क्यों? JS में आप देख सकते हैं window.location। PHP में आपको मिला SERVER_NAME
सेबस्टियन जी। मरीनस्क्यू

4
SERVER_NAME रिटर्न "www.site.com" तब भी जब पता साइट में "site.com" दर्ज किया जाता है। यदि आप अपने पूरे कोड में SERVER_NAME का उपयोग कर रहे हैं, तो अनिवार्य रूप से आप www / no-www सुरक्षा समस्या में चलेंगे, खासकर जब यह अजाक्स कॉल करने की बात आती है। लेकिन आपके सवाल का जवाब देने के लिए, उन्नत PHP प्रोग्रामिंग में, कभी-कभी PHP को कोड को गतिशील रूप से उत्पन्न करने की आवश्यकता होती है जो सर्वर पर एक HTTP कॉल करता है। यदि लक्ष्य URL में "www" पृष्ठ है, जो ऐसा नहीं करता है, तो यह एक सुरक्षा त्रुटि उत्पन्न करेगा।
InfiniteStack

ठीक है ... मैं इसके बारे में पढ़ता हूं और आप सही हैं। तो आपका जवाब किसी के लिए प्रासंगिक हो सकता है। अच्छी नौकरी :)
सेबस्टियन जी। मरीनस्कु

3

हर कोई parse_urlफ़ंक्शन का उपयोग कर रहा है, लेकिन कभी-कभी उपयोगकर्ता विभिन्न प्रारूप में argumet पास कर सकते हैं।

इसलिए इसे ठीक करने के लिए, मैंने फ़ंक्शन बनाया है। इसकी जांच करें:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

बस URL पास करें और डोमेन प्राप्त करें।

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

echo fixDomainName('https://stackoverflow.com');

वापस आ जाएगा परिणाम होगा

stackoverflow.com

और कुछ स्थिति में:

echo fixDomainName('stackoverflow.com/questions/id/slug');

और यह भी लौटेगा stackoverflow.com


1
$_SERVER['HTTP_HOST'] 

// डोमेन प्राप्त करने के लिए

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];

// प्रोटोकॉल वाला डोमेन

$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];

// प्रोटोकॉल, डोमेन, क्वेरी कुल मिलाकर ** जैसा कि $ _SERVER ['SERVER_NAME'] मल्टी डोमेन होस्टिंग के लिए विश्वसनीय नहीं है!


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