WHATWG URL স্ট্যান্ডার্ড ব্যবহার করে যেকোনো URL-কে প্রোটোকল, হোস্ট, পোর্ট, পাথ, কোয়েরি এবং ফ্র্যাগমেন্টে পার্স করুন। কোয়েরি প্যারামিটারগুলো পড়ার উপযোগী একটি টেবিলে ডিকোড করা হয়।
ব্রাউজার যা দেখে একটি URL-কে প্রতিটি কম্পোনেন্টে ভাগ করুন। একটি URL পেস্ট করুন এবং আপনার ব্রাউজার ব্যবহার করা একই WHATWG পার্সার দিয়ে প্রতিটি অংশ বের করা হয়, তাই ফলাফলটি হুবহু মিলবে যে URL আসলে কীভাবে ব্যাখ্যা করা হবে। কোয়েরি প্যারামিটারগুলো একটি টেবিলে ডিকোড করা হয়।
অধিকাংশ URL এই স্লটগুলোর কয়েকটি ব্যবহার করে, কিন্তু ব্যাকরণ সবসময় সবগুলো অনুমতি দেয়। URL পড়া মূলত জানার বিষয় যে একটি কম্পোনেন্ট কোথায় শেষ হয় এবং পরেরটি কোথায় শুরু হয়, যা ডেলিমিটার ://, @, :, /, ? এবং # দিয়ে নির্ধারিত হয়।
কম্পোনেন্ট ধরে ধরে
প্রোটোকল (স্কিম) নির্ধারণ করে কীভাবে রিসোর্স আনতে হবে — https:, mailto:, ftp:। মনে রাখবেন WHATWG পার্সার এই মানে শেষের কোলনটি অন্তর্ভুক্ত করে, যা "https" স্ট্রিংয়ের সাথে তুলনা করলে মানুষকে অবাক করে।
ব্যবহারকারীর নাম এবং পাসওয়ার্ড হলো অবনমিত userinfo অংশ। ব্রাউজারগুলো এখনও এগুলো পার্স করে কিন্তু অনুরোধ থেকে বাদ দেয় এবং প্রায়ই সতর্ক করে, কারণ URL-এ ক্রেডেনশিয়াল এমবেড করলে সেগুলো হিস্ট্রি, লগ এবং রেফারার হেডারে ফাঁস হয়ে যায়। আপনি লেখেননি এমন একটি URL-এ এগুলোর উপস্থিতিকে ফিশিং সংকেত হিসেবে বিবেচনা করুন।
হোস্টনেম হলো শুধুমাত্র ডোমেইন বা আইপি ঠিকানা। হোস্ট হলো হোস্টনেমের সাথে পোর্ট, যখন একটি নন-ডিফল্ট পোর্ট থাকে, এজন্যই এখানে দুটি ফিল্ড প্রায়ই একই দেখায়।
পোর্ট খালি থাকে যখন URL স্কিমের ডিফল্ট ব্যবহার করে — https-এর জন্য 443, http-এর জন্য 80। পার্সার এটি নর্মালাইজ করে: example.com:443/ খালি পোর্ট রিপোর্ট করে কারণ 443 কোনো তথ্য যোগ করে না।
পাথ হলো প্রথম / থেকে কোয়েরি পর্যন্ত সবকিছু। এটি একমাত্র কম্পোনেন্ট যা http(s) URL-এর জন্য কখনো খালি হয় না; একটি খালি অরিজিন / পাথ পায়।
কোয়েরি স্ট্রিং? থেকে শুরু হয় এবং প্যারামিটার বহন করে। ফ্র্যাগমেন্ট# থেকে শুরু হয় এবং একমাত্র অংশ যা কখনো সার্ভারে পাঠানো হয় না — এটি সম্পূর্ণরূপে ক্লায়েন্ট-সাইডে পরিচালিত হয়, এজন্যই সিঙ্গেল-পেজ অ্যাপগুলো একসময় রাউটিংয়ের জন্য এটি ব্যবহার করত এবং এজন্যই ফ্র্যাগমেন্টের অ্যাক্সেস টোকেন সার্ভার লগের বাইরে থাকে।
অরিজিন হলো স্কিম, হোস্ট এবং পোর্টের নিরাপত্তা-সম্পর্কিত ত্রয়ী। দুটি URL তখনই একটি অরিজিন ভাগ করে যখন তিনটিই মেলে, এবং একই-অরিজিন নীতি ও CORS সিদ্ধান্ত হুবহু এটির উপর ভিত্তি করে।
কেন পার্সারটি কঠোর
WHATWG URL পার্সার শুধুমাত্র পরম URL গ্রহণ করে। example.com/page-এ কোনো স্কিম নেই, তাই এটি নিজে থেকে পার্স করা যায় না — পার্সারের জানার কোনো উপায় নেই যে আপনি example.com/page নাকি একটি আপেক্ষিক পাথ বোঝাতে চেয়েছেন। আসল কোড একটি বেস URL-এর বিপরীতে আপেক্ষিক রেফারেন্স সমাধান করে; এই টুল ইচ্ছাকৃতভাবে পরম ফর্মের প্রয়োজন করে যাতে আপনি যা দেখেন তা দ্ব্যর্থহীন হয়।
আপনি যে নর্মালাইজেশন লক্ষ্য করবেন
পার্সার কাঁচা স্ট্রিং ফেরত দেয় না। এটি স্কিম ও হোস্ট ছোট হাতের করে, পাথে . এবং .. সেগমেন্ট সমাধান করে, ডিফল্ট পোর্ট বাদ দেয় এবং আন্তর্জাতিক ডোমেইন নামগুলিকে তাদের Punycode রূপে রূপান্তর করে, তাই münchen.de হোস্টনেম রিপোর্ট করে xn--mnchen-3ya.de। এটি একটি বৈশিষ্ট্য: এটি দেখায় URL নেটওয়ার্ক স্ট্যাক আসলে যেভাবে বিবেচনা করবে, টাইপ করা যেভাবে ছিল তা নয়।
পুনরাবৃত্ত প্যারামিটার
একটি কোয়েরি স্ট্রিং সঠিকভাবে একটি কী পুনরাবৃত্তি করতে পারে, যেমন ?tag=a&tag=b। এটি কী অর্থ বোঝায় তা নির্ধারণের কোনো স্পেসিফিকেশন নেই — কিছু ফ্রেমওয়ার্ক প্রথম মান নেয়, কিছু শেষটি, কিছু একটি অ্যারে সংগ্রহ করে। এখানকার টেবিলটি প্রতিটি উপস্থিতি ক্রমানুসারে তালিকাভুক্ত করে যাতে আপনি দেখতে পারেন ঠিক কী পাঠানো হয়েছিল, সংক্ষিপ্ত দৃশ্য নয়।
সচরাচর জিজ্ঞাসা
পোর্ট ফিল্ড কেন খালি?
কারণ URL তার স্কিমের জন্য ডিফল্ট পোর্ট ব্যবহার করে। WHATWG পার্সার https-এর জন্য 443 এবং http-এর জন্য 80 বাদ দেয়, কারণ এগুলো অন্তর্ভুক্ত করলে কোনো তথ্য যোগ হয় না এবং অরিজিন তুলনা ভেঙে দেবে।
প্রোটোকলে কেন একটি কোলন অন্তর্ভুক্ত?
URL স্ট্যান্ডার্ড এটিই সংজ্ঞায়িত করে। প্রোটোকল প্রপার্টি হলো 'https:' বরং 'https'। যদি আপনি একটি খালি স্কিম নামের সাথে তুলনা করেন, মনে রাখবেন শেষের কোলনটি হিসাব করতে হবে।
হোস্ট এবং হোস্টনেমের মধ্যে পার্থক্য কী?
হোস্টনেম হলো শুধুমাত্র ডোমেইন। হোস্টে পোর্ট অন্তর্ভুক্ত থাকে যদি একটি থাকে। https://example.com:8443/-এর জন্য হোস্টনেম হলো example.com এবং হোস্ট হলো example.com:8443।
আমি কি আপেক্ষিক URL পার্স করতে পারি না কেন?
/about বা ../img.png-এর মতো একটি আপেক্ষিক রেফারেন্স শুধুমাত্র একটি বেস URL-এর বিপরীতে অর্থবোধক। পার্সারের একটি স্কিমসহ পরম URL প্রয়োজন যাতে ফলাফল দ্ব্যর্থহীন হয়।
ফ্র্যাগমেন্ট কি সার্ভারে পাঠানো হয়?
না। #-এর পরের অংশ কখনো HTTP অনুরোধে পাঠানো হয় না। এটি সম্পূর্ণরূপে ব্রাউজারে সমাধান করা হয়, এজন্যই OAuth ইমপ্লিসিট ফ্লো টোকেনগুলো সার্ভার লগের বাইরে রাখতে এটি ব্যবহার করত।
আমার ইউনিকোড ডোমেইন কেন বদলে গেল?
আন্তর্জাতিক ডোমেইন নামগুলো Punycode-এ রূপান্তরিত হয়, যা DNS আসলে ব্যবহার করে এমন ASCII রূপ। münchen.de হয়ে যায় xn--mnchen-3ya.de। আপনার ব্রাউজার অনুরোধ করার আগে এই একই রূপান্তর সম্পাদন করে।