URL में डबल स्लैश का क्या अर्थ है?


32

URL के माध्य में अक्सर पाए जाने वाले दोहरे स्लैश वास्तव में क्या हैं?

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

  • http://www.example.com/A/B//C/

कृपया ध्यान दें कि मैं शुरुआत के ठीक बाद की बात नहीं कर रहा हूँ http:

जवाबों:


32

यह प्रोग्रामर / डेवलपर्स कोड में एक त्रुटि है। यदि आप इन दो URLS की तुलना करते हैं:

  • http://www.example.com/A/B/C/
  • http://www.example.com/A/B//C/

वे अलग दिखते हैं, लेकिन यदि आप या तो यात्रा करने के लिए थे, तो दोनों सबसे आधुनिक ब्राउज़रों में काम करेंगे।

यह कुछ ऐसा है जिसे आप ठीक करना चाहते हैं। यदि आपके पास डबल स्लैश है, तो यह Google के वेब क्रॉलर को भ्रमित कर सकता है और उन्हें लगता है कि पृष्ठ के 2 संस्करण हैं।


11
दरअसल, पृष्ठ लोड का ब्राउज़र से कोई लेना-देना नहीं है , बल्कि यह है कि सर्वर अतिरिक्त स्लैश को अनदेखा करता है। यह लंबा हो गया, इसलिए मैंने जो उत्तर पोस्ट किया है , उसे देखें ।
जोश 3736

33

जैसा कि @RandomBen द्वारा उल्लेख किया गया है , डबल स्लैश कहीं न कहीं एक त्रुटि का परिणाम है।

पृष्ठ लोड का ब्राउज़र से कोई लेना-देना नहीं है , बल्कि यह कि सर्वर अतिरिक्त स्लैश को अनदेखा करता है। ब्राउज़र URL में अतिरिक्त स्लैश के साथ कुछ विशेष नहीं करता है, यह सिर्फ अनुरोध में उन्हें भेजता है:

GET /A/B//C/D HTTP/1.1
Host: www.example.com
...

ऐसा लगता है कि अपाचे और आईआईएस के वर्तमान संस्करण दोनों ही पथ को हल करते समय अतिरिक्त स्लैश को अनदेखा कर देंगे और जो दस्तावेज़ लौटा दिए गए थे, उनमें अतिरिक्त स्लैश नहीं था। हालांकि , ब्राउज़र (आईई 8 और क्रोम 9 का परीक्षण किया) पृष्ठ में संसाधनों के किसी भी रिश्तेदार URL (मूल पथ घटकों वाले) से भ्रमित हो जाते हैं, जो खराब परिणाम उत्पन्न करता है। उदाहरण के लिए, यदि कोई पृष्ठ है:

<link rel="stylesheet" href="../../style.css" type="text/css" />

पेज लोड करने पर /a/b/c/, ब्राउज़र अनुरोध करेगा /a/style.css। लेकिन अगर किसी भी कारण /a/b//c/से - अनुरोध किया जाता है (और सर्वर अतिरिक्त स्लैश को अनदेखा करता है), तो ब्राउज़र अनुरोध को समाप्त कर /a/b/style.cssदेगा, जो मौजूद नहीं होगा। ओह, पृष्ठ बदसूरत लग रहा है।

(यह स्पष्ट रूप से नहीं होगा यदि URL में मूल पथ घटक नहीं है ..) ( या निरपेक्ष है)

यह मेरी राय है कि अपाचे और आईआईएस (और शायद अन्य) गलत तरीके से काम कर रहे हैं /a/b/c/और /a/b//c/तकनीकी रूप से दो अलग-अलग संसाधनों का प्रतिनिधित्व करते हैं। RFC 2396 के अनुसार , प्रत्येक स्लैश महत्वपूर्ण है:

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

तो, /a/b/c/तीन खंड शामिल हैं: "ए", "बी", और "सी"; /a/b//c/वास्तव में चार होते हैं: "ए", "बी", "" (खाली स्ट्रिंग), और "सी"। खाली स्ट्रिंग वैध फाइलसिस्टम निर्देशिका है या नहीं यह सर्वर के प्लेटफॉर्म का एक विवरण है। (और तार्किक रूप से, इसका अर्थ यह है कि ब्राउज़र वास्तव में सही तरीके से काम कर रहे हैं, जब मूल पथ घटकों के साथ सापेक्ष URL पार्स कर रहे हैं - मेरे उदाहरण में, वे "c" निर्देशिका और "" निर्देशिका से ऊपर जाते हैं, हमें style.css"b" से अनुरोध करने के लिए छोड़ देते हैं ।)

यदि आप अपाचे का उपयोग कर रहे हैं mod_rewrite, तो एक बहुत ही सरल सुधार है :

# remove multiple slashes anywhere in url 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

यह एक HTTP 301 Moved Permanentlyपुनर्निर्देशन जारी करेगा ताकि किसी भी डबल स्लैश को URL से बाहर निकाल दिया जाए।


2
क्या यह बेहतर नहीं होगा कि आपका mod_rewriteसमाधान 3, 4, को ध्यान में रखा जाए ... स्लैश भी? की तर्ज पर कुछ /{2,}? (मान लिया जाए कि अपाचे उस तरह के क्वांटिफायर की अनुमति देता है, मैं इससे बहुत परिचित नहीं हूं)
वार्ड मुइलार्ट

+1 - अतिरिक्त जानकारी के लिए धन्यवाद। मैंने ऐसा नहीं सोचा था!
बेन हॉफमैन

3
यह गलत व्यवहार नहीं है : a/bऔर a//bवास्तव में दो अलग-अलग URL पथ हैं, लेकिन सर्वर उन दोनों के लिए एक ही संसाधन वापस करने से मना नहीं करता है यदि वे चाहें। मैं आपसे सहमत हूँ, हालाँकि, यह है कि अभ्यास में 301 पुनर्निर्देशन अधिक उपयोगी होगा।
इल्मरी करोनन

4
@ इल्मारियारोन: यह बिल्कुल गलत व्यवहार है क्योंकि (1) यह व्यवहार स्वचालित रूप से एक एकल संसाधन के लिए संभावित दोहरे संदर्भों की एक अनंत संख्या बनाता है (जो कि, यदि किसी भी कल्पना के पत्र का उल्लंघन नहीं है, तो निश्चित रूप से भावना का उल्लंघन होता है), और अधिक व्यावहारिक रूप से (2) यह ब्राउज़रों में सापेक्ष-पथ हैंडलिंग को "ब्रेक" a//bकरता है जो एक निर्देशिका के रूप में खाली स्ट्रिंग को ठीक से गिनते हैं (ऊपर स्टाइलशीट उदाहरण देखें)।
josh3736

1
... और वैसे भी, मैं तर्क दूंगा कि RFC 2396 एक सर्वर को ऑटो-कोलैप्सिंग स्लैश द्वारा समान संसाधन को वापस करने से मना करता है क्योंकि कल्पना कहती है कि हर स्लैश महत्वपूर्ण है। स्वचालित रूप से लगातार स्लैश की अनदेखी करना उस कल्पना का उल्लंघन है। (यह एक बात है अगर कोई अपने सर्वर को ऐसा करने के लिए प्रोग्राम करे, भले ही ऐसा करना मूर्खतापूर्ण हो। हालाँकि, डिफ़ॉल्ट रूप से ऐसा करने वाला सर्वर गलत है।)
josh3736

4

डबल स्लैश का एक अर्थ है जब इसका उपयोग संसाधन URL में किया जाता है। उदाहरण के लिए, जब यह पृष्ठभूमि छवि के URL के लिए CSS में उपयोगकर्ता है:

.classname {
    background : url("//example.com/a/b/c/d.png");
}

यहां इसका मतलब है कि यह पृष्ठभूमि छवि वर्तमान वेब पेज के डोमेन के अलावा किसी अन्य डोमेन से प्राप्त हो रही है। या दूसरे शब्दों में, संसाधन URL में उस का उपयोग करते समय http://लिखा जा सकता है //

लेकिन URL (जैसे:) के बीच के इस दोहरे स्लैश का /a//b/c/d.htmकोई अर्थ नहीं है।


खैर, यह पूरी सच्चाई नहीं है। डबल स्लेश तब किया जाता है जब किसी को मिश्रित सामग्री की समस्या से बचने की आवश्यकता होती है, इस प्रकार जब साइट को http से लोड किया जाता है तो डबल का विस्तार http से होता है, जब साइट को https से लोड किया जाता है तो डबललेश को https तक विस्तारित किया जाता है।
andrej

2

जैसा कि उल्लेख किया गया है, कुछ सर्वर URL पथ में एक डबल स्लैश को अनदेखा करने के लिए सेटअप हैं, लेकिन अमेज़न S3 स्थिर होस्टिंग नहीं करेगा। यदि आप उस स्थिति में उन्हें संभालना / अनदेखा करना चाहते हैं, तो आप गुण पैनल में पुनर्निर्देशन नियमों का उपयोग कर सकते हैं ।

यदि आप डोमेन नाम के बाद किसी दोहरे स्लैश को अनदेखा करना चाहते हैं तो आप कुछ इस तरह का उपयोग कर सकते हैं:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

आप शायद उन्हें भर भी पा सकते हैं और बदल सकते हैं, लेकिन मेरे लिए यही काफी था।

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