উত্তর:
এটি প্রোগ্রামারদের / বিকাশকারীদের কোডে একটি ত্রুটি। আপনি যদি এই দুটি ইউআরএলএস তুলনা করেন:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
এগুলি দেখতে অন্যরকম তবে আপনি যদি দেখতে যান তবে উভয়ই বেশিরভাগ আধুনিক ব্রাউজারে কাজ করবে।
এটি এমন কিছু যা আপনি ঠিক করতে চান। আপনার যদি ডাবল স্ল্যাশ থাকে তবে এটি গুগলের ওয়েব ক্রলারগুলিকে বিভ্রান্ত করতে পারে এবং তাদের মনে করতে পারে যে পৃষ্ঠার 2 সংস্করণ রয়েছে।
@ র্যান্ডমবেন দ্বারা উল্লিখিত হিসাবে , ডাবল স্ল্যাশ সম্ভবত কোথাও একটি ত্রুটির ফলস্বরূপ।
পৃষ্ঠা লোডগুলির ব্রাউজারের সাথে কোনও সম্পর্ক নেই , বরং সার্ভারটি অতিরিক্ত স্ল্যাশটিকে উপেক্ষা করে। ব্রাউজারটি ইউআরএলে অতিরিক্ত স্ল্যাশ সহ বিশেষ কিছু করে না, এটি কেবল অনুরোধের সাথে তাদের প্রেরণ করে:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
দেখে মনে হচ্ছে অ্যাপাচি এবং আইআইএস উভয় সংস্করণই পথের সমাধানের সময় অতিরিক্ত স্ল্যাশগুলিকে উপেক্ষা করবে এবং URL টি অতিরিক্ত স্ল্যাশ না থাকলে ডকুমেন্টটি ফিরে আসবে return যাইহোক , ব্রাউজারগুলি (আইই 8 এবং Chrome 9 পরীক্ষা করে দেখেছি) পৃষ্ঠার সংস্থানগুলির যে কোনও আপেক্ষিক URL (প্যারেন্ট পাথ উপাদানযুক্ত) দ্বারা বিভ্রান্ত হয়, যা খারাপ ফলাফল দেয়। উদাহরণস্বরূপ, যদি কোনও পৃষ্ঠাতে থাকে:
<link rel="stylesheet" href="../../style.css" type="text/css" />
পৃষ্ঠাটি লোড করার পরে /a/b/c/
, ব্রাউজারটি অনুরোধ করবে /a/style.css
। তবে যদি whatever যে কোনও /a/b//c/
কারণেই requested অনুরোধ করা হয় (এবং সার্ভারটি অতিরিক্ত স্ল্যাশ উপেক্ষা করে), ব্রাউজারটি অনুরোধ করে শেষ হবে /a/b/style.css
, যা বিদ্যমান থাকবে না। ওফস, পৃষ্ঠাটি কুরুচিপূর্ণ দেখাচ্ছে।
(যদি URL টির কোনও প্যারেন্ট পাথ উপাদান না থাকে ( ..
) বা পরম হয় তবে এটি স্পষ্টতই ঘটবে না ))
এটি আমার মতামত যে অ্যাপাচি এবং আইআইএস (এবং সম্ভবত অন্যরা) দুটি ভিন্ন সংস্থান হিসাবে প্রযুক্তিগতভাবে প্রতিনিধিত্ব করে এবং ভুলভাবে কাজ করছে acting আরএফসি 2396 অনুসারে , প্রতিটি স্ল্যাশ উল্লেখযোগ্য:/a/b/c/
/a/b//c/
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
সুতরাং, /a/b/c/
তিনটি বিভাগ নিয়ে গঠিত: "এ", "বি", এবং "সি"; /a/b//c/
আসলে চারটি নিয়ে গঠিত: "এ", "বি", "" (খালি স্ট্রিং) এবং "সি"। খালি স্ট্রিংটি একটি বৈধ ফাইল সিস্টেম ডিরেক্টরি কিনা তা সার্ভারের প্ল্যাটফর্মের বিশদ। (এবং যৌক্তিকভাবে, এর অর্থ ব্রাউজারগুলি প্যারেন্ট পাথের উপাদানগুলির সাথে সম্পর্কিত ইউআরএলগুলি পার্স করার সময় আসলে সঠিকভাবে পরিচালিত হয় - আমার উদাহরণস্বরূপ, তারা "সি" ডিরেক্টরি এবং "" ডিরেক্টরিটি পেরিয়ে style.css
যায়, "বি" থেকে অনুরোধ করতে আমাদের ছেড়ে যায় ))
আপনি যদি অ্যাপাচি ব্যবহার করে থাকেন mod_rewrite
তবে একটি দুর্দান্ত সরল ফিক্স রয়েছে :
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
এটি একটি এইচটিটিপি 301 Moved Permanently
পুনর্নির্দেশ জারি করবে যাতে কোনও ডাবল স্ল্যাশ ইউআরএল থেকে ছিটকে যায়।
mod_rewrite
সমাধানটি 3, 4, ... স্ল্যাশগুলিকেও বিবেচনায় নেওয়া ভাল না? লাইন বরাবর কিছু /{2,}
? (ধরে নিচ্ছি আপাচি এই ধরণের
a/b
এবং a//b
প্রকৃতপক্ষে দুটি স্বতন্ত্র ইউআরএল পাথ, তবে সার্ভার এটি চাইলে উভয়ের জন্য একই উত্স ফেরত দিতে বাধা দেয় না। তবে আমি আপনার সাথে একমত হই যে অনুশীলনে 301 পুনর্নির্দেশ ফিরিয়ে দেওয়া আরও দরকারী বলে মনে হয়।
a//b
একটি ডিরেক্টরি হিসাবে খালি স্ট্রিংটি গণনা করে (উপরের স্টাইলশিটের উদাহরণ দেখুন)।
যখন এটি রিসোর্স ইউআরএল-এ ব্যবহৃত হয় তখন ডাবল স্ল্যাশের একটি অর্থ থাকে। উদাহরণস্বরূপ, যখন এটি কোনও পটভূমি চিত্রের URL এর জন্য সিএসএসে ব্যবহারকারী হয়:
.classname {
background : url("//example.com/a/b/c/d.png");
}
এখানে এর অর্থ এই পটভূমি চিত্রটি বর্তমান ওয়েব পৃষ্ঠার ডোমেন ব্যতীত অন্য কোনও ডোমেন থেকে আনা হচ্ছে। বা অন্য কথায়, http://
ঠিক যেমন //
संसाधन ইউআরএল ব্যবহার করার সময় লেখা যেতে পারে ।
তবে URL এর (যেমন /a//b/c/d.htm
:) এর মধ্যে এই ডাবল স্ল্যাশের কোনও অর্থ নেই।
উল্লিখিত হিসাবে, কিছু সার্ভারগুলি ইউআরএল পথে ডাবল স্ল্যাশ উপেক্ষা করার জন্য সেটআপ করা হয়েছে, তবে অ্যামাজন এস 3 স্ট্যাটিক হোস্টিং তা করবে না। যদি আপনি সে ক্ষেত্রে তাদের পরিচালনা / উপেক্ষা করতে চান তবে আপনি বৈশিষ্ট্য প্যানেলে পুনঃনির্দেশ বিধিগুলি ব্যবহার করতে পারেন ।
আপনি যদি ডোমেন নাম অনুসরণ করে একটি ডাবল স্ল্যাশ উপেক্ষা করতে চান তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
আপনি সম্ভবত এটিগুলি খুঁজে পেতে এবং প্রতিস্থাপন করতে পারেন, তবে এটি আমার পক্ষে যথেষ্ট ছিল।