जवाबों:
यह प्रोग्रामर / डेवलपर्स कोड में एक त्रुटि है। यदि आप इन दो URLS की तुलना करते हैं:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
वे अलग दिखते हैं, लेकिन यदि आप या तो यात्रा करने के लिए थे, तो दोनों सबसे आधुनिक ब्राउज़रों में काम करेंगे।
यह कुछ ऐसा है जिसे आप ठीक करना चाहते हैं। यदि आपके पास डबल स्लैश है, तो यह Google के वेब क्रॉलर को भ्रमित कर सकता है और उन्हें लगता है कि पृष्ठ के 2 संस्करण हैं।
जैसा कि @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 से बाहर निकाल दिया जाए।
mod_rewrite
समाधान 3, 4, को ध्यान में रखा जाए ... स्लैश भी? की तर्ज पर कुछ /{2,}
? (मान लिया जाए कि अपाचे उस तरह के क्वांटिफायर की अनुमति देता है, मैं इससे बहुत परिचित नहीं हूं)
a/b
और a//b
वास्तव में दो अलग-अलग URL पथ हैं, लेकिन सर्वर उन दोनों के लिए एक ही संसाधन वापस करने से मना नहीं करता है यदि वे चाहें। मैं आपसे सहमत हूँ, हालाँकि, यह है कि अभ्यास में 301 पुनर्निर्देशन अधिक उपयोगी होगा।
a//b
करता है जो एक निर्देशिका के रूप में खाली स्ट्रिंग को ठीक से गिनते हैं (ऊपर स्टाइलशीट उदाहरण देखें)।
डबल स्लैश का एक अर्थ है जब इसका उपयोग संसाधन URL में किया जाता है। उदाहरण के लिए, जब यह पृष्ठभूमि छवि के URL के लिए CSS में उपयोगकर्ता है:
.classname {
background : url("//example.com/a/b/c/d.png");
}
यहां इसका मतलब है कि यह पृष्ठभूमि छवि वर्तमान वेब पेज के डोमेन के अलावा किसी अन्य डोमेन से प्राप्त हो रही है। या दूसरे शब्दों में, संसाधन URL में उस का उपयोग करते समय http://
लिखा जा सकता है //
।
लेकिन URL (जैसे:) के बीच के इस दोहरे स्लैश का /a//b/c/d.htm
कोई अर्थ नहीं है।
जैसा कि उल्लेख किया गया है, कुछ सर्वर URL पथ में एक डबल स्लैश को अनदेखा करने के लिए सेटअप हैं, लेकिन अमेज़न S3 स्थिर होस्टिंग नहीं करेगा। यदि आप उस स्थिति में उन्हें संभालना / अनदेखा करना चाहते हैं, तो आप गुण पैनल में पुनर्निर्देशन नियमों का उपयोग कर सकते हैं ।
यदि आप डोमेन नाम के बाद किसी दोहरे स्लैश को अनदेखा करना चाहते हैं तो आप कुछ इस तरह का उपयोग कर सकते हैं:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
आप शायद उन्हें भर भी पा सकते हैं और बदल सकते हैं, लेकिन मेरे लिए यही काफी था।