মূল কন্টেন্টে যান

কাস্টম Captive Portal: HTML এবং CSS নির্দেশিকা

এই নির্ভরযোগ্য টেকনিক্যাল রেফারেন্স নির্দেশিকাটি একটি কাস্টম captive portal ল্যান্ডিং পেজ ডিজাইন এবং কোড করার জন্য প্রয়োজনীয় ডেভেলপমেন্ট স্ট্যান্ডার্ড, CSS আর্কিটেকচার এবং নেটওয়ার্ক-লেভেলের সীমাবদ্ধতাগুলি বর্ণনা করে। এটি ফ্রন্টএন্ড ডেভেলপার এবং নেটওয়ার্ক আর্কিটেক্টদের Apple CNA এবং Android webview পরিবেশগুলি পরিচালনা করার জন্য কার্যকর কৌশল প্রদান করে, যা পিক্সেল-পারফেক্ট, নিয়মসম্মত এবং অত্যন্ত পারফরম্যান্ট গেস্ট WiFi অভিজ্ঞতা নিশ্চিত করে।

📖 11 মিনিট পাঠ📝 3,303 শব্দ🔧 2 সমাধানকৃত উদাহরণ3 অনুশীলনী প্রশ্ন📚 8 মূল সংজ্ঞা

এই গাইডটি শুনুন

পডকাস্ট ট্রান্সক্রিপ্ট দেখুন
কাস্টম Captive Portal: HTML এবং CSS গাইড — একটি Purple টেকনিক্যাল ব্রিফিং [INTRODUCTION] Purple টেকনিক্যাল ব্রিফিং সিরিজে আপনাকে স্বাগতম। আজ আমরা এমন একটি বিষয় নিয়ে বিস্তারিত আলোচনা করছি যা প্রতিটি গেস্ট WiFi ডেপ্লয়মেন্টকে প্রভাবিত করে — আর তা হলো captive portal। বিশেষভাবে, আমরা আলোচনা করছি যে কীভাবে একটি কাস্টম captive portal ল্যান্ডিং পেজের জন্য ক্লিন এবং নির্ভরযোগ্য HTML এবং CSS কোড লিখতে হয়। আপনি যদি কখনও হোটেলের WiFi-এ কানেক্ট করার পর কোনো ভাঙা স্প্ল্যাশ পেজ দেখে থাকেন — যেখানে ইমেজ নেই, আনস্টাইলড টেক্সট, অথবা একটি লগইন বাটন যা টাচ করলে কাজ করে না — তবে আপনি বুঝতে পারবেন যখন একজন ডেভেলপার এটি যে পরিবেশে রান করবে সেই পরিবেশের সীমাবদ্ধতা না বুঝেই একটি পোর্টাল তৈরি করে তখন কী ঘটে। আজ, আমরা নিশ্চিত করব যেন আপনার সাথে এমনটি না ঘটে। এই ব্রিফিংটি ফ্রন্টএন্ড ডেভেলপার, ক্রিয়েটিভ ডিজাইনার এবং ওয়েব ডেভেলপারদের উদ্দেশ্যে তৈরি করা হয়েছে যারা একদম শুরু থেকে একটি captive portal তৈরি করছেন অথবা কোনো বিদ্যমান টেমপ্লেট কাস্টমাইজ করছেন। আমরা HTML স্ট্রাকচার, গুরুত্বপূর্ণ CSS নিয়মাবলি, Apple CNA মিনি-ব্রাউজারের সীমাবদ্ধতা যা অভিজ্ঞ ডেভেলপারদেরও বিভ্রান্ত করে, এবং কীভাবে Purple এর পোর্টাল বিল্ডারের মতো প্ল্যাটফর্মগুলো এই জটিলতার বেশিরভাগ অংশ সম্পূর্ণভাবে দূর করতে পারে সে সম্পর্কে আলোচনা করব। চলুন শুরু করা যাক। [TECHNICAL DEEP-DIVE] প্রথমে, নেটওয়ার্ক স্তরে একটি captive portal আসলে কী তা আমরা নিশ্চিত করি। যখন কোনো ডিভাইস এমন একটি WiFi নেটওয়ার্কের সাথে কানেক্ট হয় যার জন্য অথেনটিকেশন প্রয়োজন, তখন নেটওয়ার্কটি HTTP ট্রাফিক ইন্টারসেপ্ট করে এবং ব্যবহারকারীকে একটি ল্যান্ডিং পেজে রিডাইরেক্ট করে। এটিই হলো captive portal। ব্যবহারকারী একটি স্প্ল্যাশ পেজ দেখতে পান, একটি অ্যাকশন সম্পন্ন করেন — যেমন ইমেল দেওয়া, শর্তাবলী মেনে নেওয়া, অথবা সোশ্যালের মাধ্যমে লগইন করা — এবং নেটওয়ার্কটি তখন সম্পূর্ণ ইন্টারনেট অ্যাক্সেসের অনুমতি দেয়। সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো এই পেজটি কোথায় রেন্ডার হচ্ছে তা বোঝা। iOS ডিভাইসে, এটি Apple-এর Captive Network Assistant — অর্থাৎ CNA — এর ভেতরে ওপেন হয়, যা একটি স্ট্রিপড-ডাউন WebKit ওয়েবভিউ। এটি Safari নয়। এতে কোনো পার্সিস্টেন্ট কুকিজ থাকে না। এটি কোনো এক্সটার্নাল রিসোর্স লোড করতে পারে না। এতে লিমিটেড JavaScript সাপোর্ট রয়েছে। এবং ব্যবহারকারী অন্য কোনো অ্যাপে স্যুইচ করার সাথে সাথেই এটি বন্ধ হয়ে যায়। macOS-এ, CNA একটি ফিক্সড ৯০০ বাই ৫৭২ পিক্সেল সাইজে রেন্ডার হয়। Android-এ, আধুনিক ডিভাইসগুলো Chrome Custom Tabs ব্যবহার করে, যা তুলনামূলকভাবে অনেক বেশি সক্ষম। Windows 10 ব্যবহারকারীর ডিফল্ট ব্রাউজারটি ওপেন করে। Samsung ডিভাইসগুলো Samsung Internet ব্যবহার করে। এই প্ল্যাটফর্মের ভিন্নতাই হলো প্রোডাকশনে ভাঙা captive portals-এর একমাত্র সবচেয়ে বড় কারণ। ডেভেলপাররা তাদের Android ফোনে পরীক্ষা করেন, সবকিছু চমৎকার দেখায়, এবং তারপর হোটেলের iPhone ব্যবহারকারী অতিথিরা আনস্টাইলড টেক্সট সহ একটি সাদা স্ক্রিন দেখতে পান। তাই চলুন ডিফেন্সিভ কোডিং কীভাবে করতে হয় সে সম্পর্কে কথা বলি। captive portal HTML এবং CSS-এর জন্য গোল্ডেন রুলটি হলো: পেজটিকে এমনভাবে বিবেচনা করুন যেন এতে কোনো ইন্টারনেট কানেকশন নেই। কারণ অথেনটিকেশন ফেজ চলাকালীন, এটিতে সত্যিই কোনো কানেকশন থাকে না। নেটওয়ার্কটি তখন ক্যাপটিভ থাকে। আপনার পেজটি কোনো এক্সটার্নাল URL থেকে যে কোনো রিসোর্স লোড করার চেষ্টা করলে — যেমন একটি Google Font, একটি CDN-হোস্টেড স্টাইলশিট, একটি JavaScript লাইব্রেরি, অথবা একটি লোগো ইমেজ — তা নীরবেই ব্যর্থ হবে অথবা একটি লোডিং স্পিনার দেখাবে যা কখনই শেষ হবে না।HTML স্ট্রাকচার দিয়ে শুরু করা যাক। আপনার ডকুমেন্টটি একটি পরিচ্ছন্ন HTML5 পেজ হতে হবে। হেডের মধ্যে, content-এ width equals device-width এবং initial-scale equals one সেট করা একটি ভিউপোর্ট মেটা ট্যাগ প্রয়োজন। মোবাইল রেন্ডারিংয়ের জন্য এটি অবশ্যই প্রয়োজন। এটি ছাড়া, iOS পেজটিকে ৯৮০ পিক্সেল চওড়া হিসেবে রেন্ডার করবে এবং এটিকে ছোট করে দেখাবে, যার ফলে সবকিছু অত্যন্ত ক্ষুদ্র দেখাবে। আপনার CSS অবশ্যই ইনলাইন হতে হবে - হয় হেড এলিমেন্টের মধ্যে একটি স্টাইল ব্লকে, অথবা নির্দিষ্ট এলিমেন্টের ইনলাইন স্টাইল অ্যাট্রিবিউট হিসেবে। link ট্যাগের মাধ্যমে যুক্ত কোনো এক্সটার্নাল স্টাইলশিট ব্যবহার করবেন না। সেই স্টাইলশিটটি আপনার সার্ভারে থাকে, যা অথেনটিকেশনের সময় captive network অ্যাক্সেস করতে পারে না। ফলে পেজটি সম্পূর্ণ স্টাইল ছাড়া রেন্ডার হবে। ফন্টের জন্য, একটি সিস্টেম ফন্ট স্ট্যাক ব্যবহার করুন। যেমন: font-family - apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif। এটি ব্রাউজারকে যেকোনো উপলব্ধ সিস্টেম ফন্ট ব্যবহার করার নির্দেশ দেয়। Google Fonts ব্যবহার করবেন না। ইম্পোর্ট কলটি ব্যর্থ হবে এবং আপনার ফলব্যাক ফন্টটি Times New Roman হয়ে যাবে, যা আপনার ক্লায়েন্ট যে ব্র্যান্ড অভিজ্ঞতার জন্য অর্থ প্রদান করছে তার সাথে মেলে না। ছবির জন্য - আপনার লোগো, ব্যাকগ্রাউন্ড গ্রাফিক্স, অলঙ্করণ উপাদান - আপনার কাছে দুটি বিকল্প রয়েছে। হয় সেগুলোকে একই Captive Portal সার্ভার থেকে পরিবেশন করুন, যার অর্থ সেগুলি একই লোকাল নেটওয়ার্কে রয়েছে এবং অথেনটিকেশন সম্পন্ন হওয়ার আগেই অ্যাক্সেস করা সম্ভব। অথবা, আরও ভালো হয় যদি সেগুলোকে সরাসরি আপনার HTML বা CSS-এ Base64 ডেটা URI হিসেবে এনকোড করেন। এটি এক্সটার্নাল ডিপেন্ডেন্সি সম্পূর্ণভাবে দূর করে। এখন পেজ লেআউট নিয়ে কথা বলা যাক। যেহেতু Captive Portal লগইনের ৯০ শতাংশেরও বেশি মোবাইল ডিভাইসে ঘটে, তাই আপনার ডিজাইনটি মোবাইল-ফার্স্ট হওয়া উচিত। তার মানে একটি সিঙ্গেল-কলাম লেআউট, সর্বোচ্চ চওড়া প্রায় ৪৮০ পিক্সেল এবং পেজের মাঝখানে অবস্থিত। বডি এলিমেন্টে ফ্লেক্সবক্স ব্যবহার করুন - display flex, flex-direction column, align-items centre, justify-content centre, min-height 100 viewport height। এটি যেকোনো স্ক্রিন সাইজে আপনার কনটেন্ট কার্ডটিকে উলম্ব এবং অনুভূমিকভাবে সেন্টারে নিয়ে আসে। আপনার প্রাইমারি কল-টু-অ্যাকশন বাটনে টাচ-ফ্রেন্ডলি হওয়া প্রয়োজন। Apple-এর হিউম্যান ইন্টারফেস নির্দেশিকায় ন্যূনতম ট্যাপ টার্গেট ৪৪ বাই ৪৪ পিক্সেল নির্দিষ্ট করা হয়েছে। বাস্তবে, একটি প্রাইমারি CTA-এর জন্য আপনার প্রায় ৪৮ পিক্সেল লম্বা, কন্টেইনারের মধ্যে সম্পূর্ণ চওড়া এবং প্রায় ৮ থেকে ১২ পিক্সেলের বর্ডার-রেডিয়াস প্রয়োজন। ফর্ম ফিল্ডের জন্য - ইমেল ইনপুট, নাম ইনপুট - ফন্ট-সাইজ কমপক্ষে ১৬ পিক্সেল সেট করুন। এটি অত্যন্ত গুরুত্বপূর্ণ। iOS Safari এবং CNA ১৬ পিক্সেলের কম ফন্ট-সাইজ বিশিষ্ট যেকোনো ইনপুট ফিল্ডকে অটোমেটিক জুম ইন করবে, যা আপনার যত্ন সহকারে তৈরি করা লেআউটটিকে নষ্ট করে দেয়। ফন্ট-সাইজ ১৬ পিক্সেল বা তার বেশি সেট করলে এই জুম আচরণটি প্রতিরোধ করা যায়। আইনি সম্মতি বা লিগ্যাল কনসেন্ট সেকশনটির দিকে বিশেষ মনোযোগ দেওয়া প্রয়োজন। GDPR-এর অধীনে, আপনি যদি ব্যক্তিগত তথ্য সংগ্রহ করেন - এমনকি শুধুমাত্র একটি ইমেল ঠিকানাও - তবে আপনার সুস্পষ্ট ও অবহিত সম্মতি প্রয়োজন। এর অর্থ হলো একটি চেকবক্স যা ডিফল্টভাবে আনচেক করা থাকবে এবং সাথে একটি দৃশ্যমান লেবেল থাকবে যা ব্যবহারকারী কিসে সম্মতি দিচ্ছেন তা স্পষ্টভাবে উল্লেখ করবে। চেকবক্সে আগে থেকে টিক দিয়ে রাখবেন না। সম্মতি জানানোর চেকবক্সটি স্ক্রল করা ছাড়াই স্পষ্টভাবে দৃশ্যমান হতে হবে। এখন, বিশেষভাবে iOS CNA-এর জন্য একটি অত্যন্ত গুরুত্বপূর্ণ ইমপ্লিমেন্টেশন ডিটেইল। ব্যবহারকারী যখন অথেন্টিকেশন সম্পন্ন করেন, তখন CNA মনিটর করে যে ক্যাপটিভ ডোমেনটি অ্যাক্সেসযোগ্য হয়েছে কিনা। এই পরীক্ষাটি ফুল পেজ নেভিগেশন দ্বারা ট্রিগার হয়, কোনো JavaScript AJAX কলের মাধ্যমে নয়। এর মানে হল আপনি যদি একটি সিঙ্গেল-পেজ অ্যাপ তৈরি করেন যা fetch বা XMLHttpRequest-এর মাধ্যমে ফর্ম সাবমিট করে এবং ফুল পেজ রিডাইরেক্ট ছাড়াই DOM আপডেট করে, তবে CNA কখনই সনাক্ত করতে পারবে না যে অথেন্টিকেশন সম্পন্ন হয়েছে। অথেন্টিকেশনের পরে আপনাকে অবশ্যই একটি নতুন URL-এ রিডাইরেক্ট করতে হবে - একটি সম্পূর্ণ HTTP রিডাইরেক্ট, কোনো JavaScript DOM ম্যানিপুলেশন নয়। ক্যাপটিভ পোর্টাল ডেভেলপমেন্টে এটি সবচেয়ে সাধারণ ভুলগুলোর একটি। JavaScript-এর ক্ষেত্রে, এটিকে ন্যূনতম রাখুন। CNA-এর সীমিত JS সাপোর্ট রয়েছে এবং localStorage বা sessionStorage-এ কোনো অ্যাক্সেস নেই। CNA বন্ধ হয়ে গেলে কুকিজ ধ্বংস হয়ে যায়। এই ব্রাউজার API-গুলোর উপর নির্ভরশীল যেকোনো স্টেট ম্যানেজমেন্ট ব্যর্থ হবে। ভ্যানিলা JavaScript ইভেন্ট লিসেনারগুলো ঠিক আছে। jQuery হল একটি ৩০-কিলোবাইটের এক্সটার্নাল ডিপেন্ডেন্সি যা লোড হতে ব্যর্থ হবে। [ইমপ্লিমেন্টেশন সুপারিশ এবং ত্রুটিসমূহ] আপনাকে ব্যবহারিক ইমপ্লিমেন্টেশনের চেকলিস্টটি দেওয়া যাক। প্রথম: ভিউপোর্ট মেটা ট্যাগ, সবসময়। দ্বিতীয়: সব CSS ইনলাইন, কোনো এক্সটার্নাল স্টাইলশিট নয়। তৃতীয়: সমস্ত ইমেজ ক্যাপটিভ পোর্টাল সার্ভার থেকে পরিবেশন করা অথবা Base64-এনকোডেড হতে হবে। চতুর্থ: সিস্টেম ফন্ট স্ট্যাক, কোনো ওয়েব ফন্ট নয়। পঞ্চম: সমস্ত ইনপুট ফিল্ডে ন্যূনতম ১৬ পিক্সেল ফন্ট সাইজ। ষষ্ঠ: টাচ-ফ্রেন্ডলি ট্যাপ টার্গেট, ন্যূনতম ৪৪ বাই ৪৪ পিক্সেল। সপ্তম: সিঙ্গেল কলাম লেআউট, সর্বোচ্চ-প্রস্থ ৪৮০ পিক্সেল। অষ্টম: অথেন্টিকেশনে ফুল পেজ রিডাইরেক্ট, কোনো JavaScript স্টেট আপডেট নয়। নবম: GDPR-সম্মত সম্মতি চেকবক্স, যা ডিফল্টরূপে আনচেক করা থাকবে। দশম: ব্রাউজার প্রিভিউতে নয়, বরং একটি আসল ক্যাপটিভ নেটওয়ার্ক ব্যবহার করে একটি আসল iOS ডিভাইসে পরীক্ষা করুন। প্রোডাকশনে আমি যেসব ত্রুটি সবচেয়ে বেশি দেখি। এক নম্বর: Google Fonts - ইম্পোর্টটি বাদ দিন, এটি ব্যর্থ হবে। দুই নম্বর: এক্সটার্নাল JavaScript লাইব্রেরি - Bootstrap, jQuery বা যেকোনো CDN-হোস্টেড স্ক্রিপ্ট ব্যর্থ হবে। তিন নম্বর: এক্সটার্নাল স্টাইলশিটে ডিক্লেয়ার করা CSS ভেরিয়েবল - এগুলো অবশ্যই আপনার ইনলাইন স্টাইল ব্লকে থাকতে হবে। চার নম্বর: URL দ্বারা রেফারেন্স করা ব্যাকগ্রাউন্ড ইমেজ - এগুলোকে Base64 এনকোড করুন। পাঁচ নম্বর: পোস্ট-অথেন্টিকেশন রিডাইরেক্ট ছাড়া AJAX ফর্ম সাবমিশন - CNA অথেন্টিকেশন সম্পন্ন হওয়া সনাক্ত করতে পারবে না। এখন, তৈরি করা বনাম কেনার বিষয়ে একটি অকপট আলোচনা। স্ক্র্যাচ থেকে একটি কাস্টম ক্যাপটিভ পোর্টাল তৈরি করার অর্থ হল আপনি ব্যাকএন্ড ইনফ্রাস্ট্রাকচারের জন্যও দায়ী - RADIUS সার্ভার, ডেটাবেস, SSL সার্টিফিকেট, DNS কনফিগারেশন, আপনার অ্যাক্সেস পয়েন্টগুলোর সাথে নেটওয়ার্ক ইন্টিগ্রেশন এবং চলমান সিকিউরিটি প্যাচিং। এটি একটি উল্লেখযোগ্য ইঞ্জিনিয়ারিং প্রতিশ্রুতি। Purple-এর পোর্টাল বিল্ডার আপনাকে একটি ড্র্যাগ-অ্যান্ড-ড্রপ ইন্টারফেসের সাথে ডেভেলপারদের জন্য একটি কাস্টম HTML এবং CSS এডিটর প্রদান করে যাদের পিক্সেল-নিখুঁত নিয়ন্ত্রণ প্রয়োজন, পাশাপাশি এটি সমস্ত ব্যাকএন্ড ইনফ্রাস্ট্রাকচার হ্যান্ডেল করে - অথেন্টিকেশন, ডেটা ক্যাপচার, অ্যানালিটিক্স, GDPR কমপ্লায়েন্স টুলিং এবং ২০০টিরও বেশি অ্যাক্সেস পয়েন্ট ভেন্ডরের সাথে নেটওয়ার্ক ইন্টিগ্রেশন। আপনি ইনফ্রাস্ট্রাকচারের ঝামেলা ছাড়াই ক্রিয়েটিভ কন্ট্রোল পেয়ে যাচ্ছেন। [র‍্যাপিড-ফায়ার প্রশ্নোত্তর] আমি কি একটি captive portal-এ CSS Grid ব্যবহার করতে পারি? হ্যাঁ, তবে বিশেষভাবে iOS CNA-তে পরীক্ষা করুন। পুরানো WebKit সংস্করণগুলোতে Flexbox-এর আরও ব্যাপক সমর্থন রয়েছে। আমি কি SVG লোগো ব্যবহার করতে পারি? হ্যাঁ, ইনলাইন SVG সম্পূর্ণ সমর্থিত এবং লোগোর জন্য Base64-এনকোডেড PNG-এর চেয়ে বেশি পছন্দনীয় কারণ এগুলো রেটিনা ডিসপ্লেতে নিখুঁতভাবে স্কেল করে। macOS CNA কি iOS CNA-এর মতো একই সীমাবদ্ধতা সমর্থন করে? ব্যাপকভাবে হ্যাঁ, একটি পার্থক্য সহ: macOS CNA একটি নির্দিষ্ট ৯০০ বাই ৫৭২ পিক্সেল উইন্ডোতে রেন্ডার করে। আমি কি Tailwind-এর মতো কোনো CSS ফ্রেমওয়ার্ক ব্যবহার করতে পারি? কেবল তখনই যদি আপনি একটি পার্জড, স্বয়ংসম্পূর্ণ CSS ফাইল তৈরি করেন এবং এটি আপনার স্টাইল ব্লকে ইনলাইন করেন। HTTPS-এর ক্ষেত্রে কী হবে? প্রাথমিক রিডাইরেক্ট কাজ করার জন্য আপনার captive portal-টি অবশ্যই HTTP-র মাধ্যমে পরিবেশন করতে হবে - HTTPS সংযোগগুলো captive network দ্বারা ইন্টারসেপ্ট করা যায় না। [সংক্ষেপ এবং পরবর্তী পদক্ষেপ] আজকের ব্রিফিং সংক্ষেপ করতে বলা যায়: একটি কাস্টম captive portal একটি সীমাবদ্ধ ওয়েব পরিবেশ, কোনো স্ট্যান্ডার্ড ব্রাউজার প্রসঙ্গ নয়। Apple CNA এবং Android ওয়েবভিউ বাহ্যিক রিসোর্স, কুকিজ, JavaScript এবং সেশন স্টেটের ওপর কঠোর সীমাবদ্ধতা আরোপ করে। এর সমাধান হলো ইনলাইন CSS, সিস্টেম ফন্ট, Base64-এনকোডেড ইমেজ এবং প্রমাণীকরণের পর সম্পূর্ণ পেজ রিডাইরেক্ট সহ স্বয়ংসম্পূর্ণ HTML পেজ তৈরি করা। ভেন্যু অপারেটর এবং IT টিমগুলোর জন্য তাদের বিকল্পগুলো মূল্যায়ন করতে বলা যায়: আপনার প্রয়োজন যদি কাস্টম HTML এবং CSS সহ একটি সম্পূর্ণ ব্র্যান্ডেড, বেসপোক পোর্টাল হয়, তবে বিকল্পটি হলো সম্পূর্ণ স্ট্যাকটি নিজেই তৈরি করা এবং বজায় রাখা - যা একটি উল্লেখযোগ্য ইঞ্জিনিয়ারিং প্রতিশ্রুতি - অথবা Purple-এর মতো একটি প্ল্যাটফর্ম ব্যবহার করা যা একটি প্রোডাকশন-গ্রেড ব্যাকএন্ড পরিকাঠামোর ওপরে কাস্টম HTML এবং CSS এডিটিং সুবিধা প্রদান করে। এখান থেকে পরবর্তী পদক্ষেপগুলো হলো: Purple-এর পোর্টাল এডিটর ডকুমেন্টেশন পর্যালোচনা করুন, আজ আমরা যে মোবাইল-ফার্স্ট চেকলিস্ট আলোচনা করেছি তার বিপরীতে আপনার বিদ্যমান পোর্টালটি অডিট করুন এবং আপনি যদি নতুন করে শুরু করেন, তবে আমাদের রূপরেখা দেওয়া HTML টেমপ্লেট কাঠামোটি আপনার বেসলাইন হিসেবে ব্যবহার করুন। শোনার জন্য ধন্যবাদ, পরবর্তী ব্রিফিংয়ে আপনার সাথে দেখা হবে।

📚 আমাদের মূল সিরিজের অংশ: Captive Portal-এর চূড়ান্ত নির্দেশিকা

header_image.png

এক্সিকিউটিভ সামারি

এন্টারপ্রাইজ ভেন্যুগুলোর জন্য - যার মধ্যে বিলাসবহুল হোটেল Hospitality এবং রিটেল চেইন Retail থেকে শুরু করে ট্রানজিট হাব Transport এবং আধুনিক মেডিকেল ক্যাম্পাস Healthcare অন্তর্ভুক্ত রয়েছে - গেস্ট WiFi স্প্ল্যাশ পেজ হলো ডিজিটাল সদর দরজা। তবে, ৯০% এরও বেশি গেস্ট WiFi লগইন সম্পন্ন হয় মোবাইল ডিভাইসে, যেখানে রেন্ডারিং স্ট্যান্ডার্ড ব্রাউজার যেমন Safari বা Chrome দ্বারা নিয়ন্ত্রিত হয় না, বরং অত্যন্ত সীমাবদ্ধ Captive Network Assistant (CNA) ওয়েবভিউ দ্বারা নিয়ন্ত্রিত হয় [1]। এই "মিনি-ব্রাউজার" গুলো কঠোর স্যান্ডবক্স সীমাবদ্ধতা প্রয়োগ করে: এগুলো এক্সটার্নাল CDN ব্লক করে, পারসিস্টেন্ট কুকিজ নিষ্ক্রিয় করে, এক্সটার্নাল ওয়েব ফন্ট উপেক্ষা করে এবং নিরাপত্তা ঝুঁকি কমাতে ও সেশন হাইজ্যাকিং প্রতিরোধ করতে JavaScript এক্সিকিউশন মারাত্মকভাবে সীমাবদ্ধ করে [2]।

যখন একজন ডেভেলপার প্রচলিত ওয়েব স্ট্যান্ডার্ড ব্যবহার করে একটি স্প্ল্যাশ পেজ ডিজাইন করেন, তখন এই সীমাবদ্ধতাগুলোর কারণে লেআউট ভেঙে যায়, ব্র্যান্ড অ্যাসেট অনুপস্থিত থাকে এবং লগইন বোতাম কাজ করে না, যা সরাসরি কাস্টমার স্যাটিসফ্যাকশন এবং ডিজিটাল এনগেজমেন্টকে প্রভাবিত করে। এই গাইডটি এই চ্যালেঞ্জগুলোর সমাধান প্রদান করে, ডিফেন্সিভ কোডিং অনুশীলনের চিত্র তুলে ধরে - যেমন ইনলাইন CSS, Base64 অ্যাসেট এনকোডিং, সিস্টেম ফন্ট স্ট্যাক এবং সুনির্দিষ্ট নেভিগেশন-চালিত অথেন্টিকেশন হ্যান্ডশেক - যা নির্বিঘ্ন ক্রস-প্ল্যাটফর্ম রেন্ডারিং নিশ্চিত করে। উপরন্তু, আমরা আলোচনা করব কীভাবে Purple-এর পোর্টাল বিল্ডারের মতো একটি ম্যানেজড সলিউশন ব্যবহার করে ডেভেলপাররা RADIUS অথেন্টিকেশন, ডেটাবেস স্কেলিং, GDPR/PCI কমপ্লায়েন্স এবং মাল্টি-ভেন্ডর AP ইন্টিগ্রেশন আউটসোর্স করার পাশাপাশি সম্পূর্ণ HTML/CSS ক্রিয়েটিভ কন্ট্রোল বজায় রাখতে পারেন [3]।

টেকনিক্যাল ডিপ-ডাইভ

একটি স্থিতিস্থাপক কাস্টম ক্যাপটিভ পোর্টাল তৈরি করতে, ডেভেলপারদের অবশ্যই নেটওয়ার্ক-লেভেল ইন্টারসেপশন এবং ব্রাউজার ভার্চুয়ালাইজেশন বুঝতে হবে যা ঘটে যখন একজন গেস্ট একটি ওপেন SSID-এর সাথে যুক্ত হয়।

ক্যাপটিভ পোর্টাল লাইফসাইকেল

যখন একটি ক্লায়েন্ট ডিভাইস একটি ক্যাপটিভ SSID-এর সাথে যুক্ত হয়, তখন নিম্নলিখিত সিকোয়েন্সটি ট্রিগার হয়:

১. IP অ্যাসোসিয়েশন: ডিভাইসটি একটি 3-ওয়ে হ্যান্ডশেক সম্পন্ন করে এবং DHCP-এর মাধ্যমে একটি IP অ্যাড্রেসের জন্য অনুরোধ করে। ২. অ্যাক্টিভ কানেক্টিভিটি প্রোব: অপারেটিং সিস্টেমের ব্যাকগ্রাউন্ড নেটওয়ার্ক ম্যানেজার অবিলম্বে একটি ডেডিকেটেড ভেন্ডর-নিরপেক্ষ কানারি URL-এ একটি HTTP GET অনুরোধ পাঠায় (যেমন, Apple-এর http://captive.apple.com/hotspot-detect.html বা Google-এর http://connectivitycheck.gstatic.com/generate_204) [1]। ৩. DNS/HTTP ইন্টারসেপশন: লোকাল ওয়্যারলেস ল্যান কন্ট্রোলার (WLC) বা Access Point (AP) এই পোর্ট ৮০ HTTP অনুরোধটিকে ইন্টারসেপ্ট বা বাধা দেয়। প্রত্যাশিত HTTP 200 বা 204 স্ট্যাটাস ফেরত দেওয়ার পরিবর্তে, গেটওয়েটি একটি HTTP 302 রিডাইরেক্টের মাধ্যমে ক্লায়েন্টের ট্রাফিককে ক্যাপটিভ পোর্টালের ল্যান্ডিং পেজ URL-এ রিডাইরেক্ট করে [2]। ৪. ওয়েবভিউ স্পনিং: রিডাইরেক্ট শনাক্ত করে, OS রিডাইরেক্ট করা স্প্ল্যাশ পেজটি প্রদর্শন করতে তার নেটিভ Captive Network Assistant (CNA) মিনি-ব্রাউজারটি চালু করে, যার ফলে ব্যবহারকারীর ম্যানুয়ালি একটি সম্পূর্ণ ব্রাউজার খোলার প্রয়োজন হয় না।5. Authentication and State Transition: ব্যবহারকারী লগইন ফর্মটি পূরণ করেন, পোর্টাল সার্ভারে ক্রেডেনশিয়াল জমা দেন, যা গেটওয়েকে (প্রায়শই একটি RADIUS Access-Accept বা বাহ্যিক API কলের মাধ্যমে) MAC অ্যাড্রেসটি অথরাইজ করার নির্দেশ দেয়। 6. CNA Exit Handshake: CNA মিনি-ব্রাউজারটি তার ক্যানারি URL-এ অন্য একটি HTTP GET সম্পাদন করে। যদি এটি প্রত্যাশিত 200/204 রেসপন্স পায়, তবে এটি তার উপরের ডানদিকের বোতামটি "Cancel" থেকে "Done"-এ পরিবর্তন করে এবং প্রাথমিক নেটওয়ার্ক ইন্টারফেস হিসাবে WiFi সংযোগটি স্থাপন করে।

Platform-Specific Mini-Browser Constraints

প্রতিটি অপারেটিং সিস্টেম বিভিন্ন ওয়েবভিউ এনভায়রনমেন্টের মধ্যে এই লাইফসাইকেলটি পরিচালনা করে, যার ফলে অত্যন্ত খণ্ডিত আচরণ দেখা যায়। নিচের টেবিলে এই গুরুত্বপূর্ণ সীমাবদ্ধতাগুলো বিস্তারিত দেওয়া হলো:

প্ল্যাটফর্ম / ওয়েবভিউ ডিসপ্লে পদ্ধতি পারসিস্টেন্ট কুকিজ বাহ্যিক ওয়েব ফন্ট JavaScript এক্সিকিউশন উইন্ডোর পরিমাপ এক্সিট হ্যান্ডশেক ট্রিগার
Apple iOS CNA (Websheet) মিনি-ব্রাউজার পপআপ ব্লকড (বন্ধ করার সময় নষ্ট হয়ে যায়) ব্লকড (অফলাইন) সীমিত (কোনো localStorage/sessionStorage নেই) রেসপন্সিভ (ডিভাইসের প্রস্থ) শুধুমাত্র ফুল-পেজ HTTP রিডাইরেক্ট [1]
Apple macOS CNA (Captive Network Assistant) মিনি-ব্রাউজার পপআপ ব্লকড ব্লকড সীমিত (কোনো অ্যালার্ট/কনফার্ম ডায়ালগ নেই) স্থির (900px x 572px) শুধুমাত্র ফুল-পেজ HTTP রিডাইরেক্ট
Android (Google) (CaptivePortalLogin) পুশ নোটিফিকেশন -> Chrome কাস্টম ট্যাব অনুমোদিত (Chrome-এর সাথে শেয়ার করা) অনুমোদিত (যদি ওয়াল্ড গার্ডেনে হোয়াইটলিস্ট করা থাকে) সম্পূর্ণ রেসপন্সিভ স্বয়ংক্রিয় (Captive Portal API / 204 চেক) [2]
Samsung Android (Samsung Internet) পুশ নোটিফিকেশন -> মিনি-ব্রাউজার অনুমোদিত অনুমোদিত সম্পূর্ণ রেসপন্সিভ স্বয়ংক্রিয়
Windows 10/11 (ডিফল্ট ব্রাউজার) অটো-লঞ্চ ডিফল্ট ব্রাউজার অনুমোদিত (সম্পূর্ণ ব্রাউজার কনটেক্সট) অনুমোদিত সম্পূর্ণ রেসপন্সিভ ম্যানুয়াল / স্বয়ংক্রিয়

cna_constraints_comparison.png

Coding Around the Apple CNA "Done" Button Trap

কাস্টম পোর্টাল ডেভেলপমেন্টের ক্ষেত্রে সবচেয়ে ঘন ঘন ব্যর্থতার একটি মোড হলো iOS ডিভাইসে "Done" Button Trap। যখন একজন ব্যবহারকারী অথেন্টিকেট করেন, তখন iOS Websheet ওয়েবভিউকে অবশ্যই সনাক্ত করতে হবে যে নেটওয়ার্কটি আর ক্যাপটিভ অবস্থায় নেই। এটি তার ব্যাকগ্রাউন্ড ক্যানারি রিকোয়েস্টের সাফল্য পর্যবেক্ষণ করে এই কাজটি সম্পন্ন করে।অত্যন্ত গুরুত্বপূর্ণ বিষয় হলো, iOS CNA শুধুমাত্র একটি সম্পূর্ণ-পৃষ্ঠার HTTP নেভিগেশনের (অবস্থান রিডাইরেক্ট) পরেই এই পরীক্ষাটি শুরু করবে। কোনো ডেভেলপার যদি একটি আধুনিক Single Page Application (SPA) তৈরি করেন যা একটি অ্যাসিঙ্ক্রোনাস AJAX কল (যেমন- fetch() বা Axios) এর মাধ্যমে ফর্ম ডেটা সাবমিট করে এবং URL পরিবর্তন না করে ডাইনামিকালি DOM আপডেট করে, তবে CNA তার কানেক্টিভিটি চেকটি কখনোই পুনরায় রান করবে না। ব্যবহারকারী গেটওয়ে স্তরে প্রমাণীকরণ বা অথেন্টিকেশন সম্পন্ন করবেন, কিন্তু ডানদিকের উপরের কোণায় থাকা CNA বোতামটি "Cancel" হিসেবেই থেকে যাবে। হতাশ ব্যবহারকারী যদি "Cancel" এ ক্লিক করেন, তবে iOS ডিভাইসটি অবিলম্বে SSID থেকে বিচ্ছিন্ন হয়ে যাবে এবং WiFi সেশনটি বন্ধ করে দেবে [1]।

এটি প্রতিরোধ করতে, অথেন্টিকেশন সফল হওয়ার হ্যান্ডলারকে অবশ্যই একটি ফিজিক্যাল ল্যান্ডিং পেজে সম্পূর্ণ-পৃষ্ঠার রিডাইরেক্ট সম্পন্ন করতে হবে (যেমন- window.location.href = '/success') অথবা একটি স্ট্যান্ডার্ড HTTP POST অ্যাকশনের মাধ্যমে নেটিভভাবে লগইন ফর্মটি সাবমিট করতে হবে।

বাস্তবায়ন গাইড

সব প্ল্যাটফর্ম জুড়ে সামঞ্জস্যপূর্ণ রেন্ডারিং নিশ্চিত করতে, ডেভেলপারদের আধুনিক ও অ্যাসেট-ভারী ওয়েব ডিজাইন থেকে সরে এসে একটি অত্যন্ত স্বয়ংসম্পূর্ণ, ডিফেন্সিভ কোডিং স্টাইল গ্রহণ করতে হবে।

সুবর্ণ নিয়ম: শূন্য ইন্টারনেট কানেক্টিভিটির জন্য ডিজাইন করুন

ক্যাপটিভ অবস্থায় থাকাকালীন, ক্লায়েন্ট ডিভাইসের উইডার ইন্টারনেটে কোনো অ্যাক্সেস থাকে না। এটি শুধুমাত্র ওয়্যারলেস কন্ট্রোলারের Walled Garden-এ (যেমন স্বয়ং Captive Portal সার্ভারের IP) স্পষ্টভাবে হোয়াইটলিস্ট করা IP অ্যাড্রেস এবং ডোমেনগুলোই রিসলভ এবং অ্যাক্সেস করতে পারে। তাই, আপনার HTML-এ রেফারেন্স করা যেকোনো বাহ্যিক অ্যাসেট লোড হতে ব্যর্থ হবে, যার ফলে লেআউটটি ভেঙে যাবে।

ডিফেন্সিভ ডিজাইনের জন্য, নিম্নলিখিত মোবাইল-ফার্স্ট Captive Portal ডিজাইন চেকলিস্টটি বাস্তবায়ন করুন:

mobile_first_checklist.png

১. ভিউপোর্ট কনফিগারেশন

মোবাইল ডিভাইসগুলো যাতে ভিউপোর্টটিকে ডেস্কটপ উইডথ-এ (সাধারণত ৯৮০ পিক্সেল) ছোট করে না ফেলে, তার জন্য HTML <head>-এ অবশ্যই একটি রেসপন্সিভ ভিউপোর্ট মেটা ট্যাগ অন্তর্ভুক্ত করতে হবে। এটি ছাড়া, মোবাইল ডিভাইসে টেক্সট এবং ইনপুট ফিল্ডগুলো অত্যন্ত ক্ষুদ্র দেখাবে:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

২. সিএসএস ইনলাইন করা এবং বাহ্যিক ডিপেন্ডেন্সিগুলো সরিয়ে ফেলা

বাহ্যিক CSS ফাইল বা CDN (যেমন- Bootstrap, Tailwind, বা Google Fonts) এর সাথে কখনোই লিঙ্ক করবেন না। সমস্ত CSS অবশ্যই HTML <head>-এর একটি <style> ব্লকের মধ্যে এমবেড করা থাকতে হবে।

টাইপোগ্রাফির জন্য, একটি সিস্টেম ফন্ট স্ট্যাক ব্যবহার করুন যা আগে থেকে ইনস্টল করা লোকাল অপারেটিং সিস্টেম ফন্টগুলোকে রেফারেন্স করে। এটি সম্পূর্ণভাবে HTTP রিকোয়েস্ট এড়ায় এবং ডিভাইসের নেটিভ, উচ্চ-মানের স্যান্স-সেরিফ টাইপফেস ব্যবহার করে পৃষ্ঠাটি তাত্ক্ষণিকভাবে লোড হওয়া নিশ্চিত করে:

body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    background-color: #F5F1ED; /* Pearl White Brand Colour */
    color: #011638; /* Dark Blue Brand Colour */
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
}

৩. Base64 অ্যাসেট এনকোডিং

ইমেজ, লোগো এবং আইকনগুলোকে এক্সটার্নাল HTTP URL-এর মাধ্যমে রেফারেন্স করা উচিত নয়, যদি না হোস্টিং ডোমেনটি গেটওয়ের ওয়াল্ড গার্ডেনে হোয়াইটলিস্ট করা থাকে। সবচেয়ে নির্ভরযোগ্য পদ্ধতি হলো ছোট ভিজ্যুয়াল অ্যাসেট (যেমন PNG বা SVG লোগো) সরাসরি HTML বা CSS-এ Base64 ডেটা URI হিসেবে এনকোড করা:

<!-- Inline Base64 Logo Example -->
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MCIgZmlsbD0iIzc0NThGRCIvPjwvc3ZnPg==" alt="Purple Logo" class="brand-logo">

৪. ইনপুট ফিল্ড এবং ট্যাপ টার্গেট অপ্টিমাইজেশন

মোবাইল ব্যবহারযোগ্যতার মানদণ্ড (যেমন Apple-এর Human Interface Guidelines) মেনে চলার জন্য, সমস্ত ইন্টারেক্টিভ এলিমেন্ট স্পর্শ ইনপুটের জন্য অপ্টিমাইজ করা আবশ্যক:

  • ইনপুট ফন্ট সাইজ: ইনপুট টেক্সটের ফন্টের সাইজ কমপক্ষে ১৬ পিক্সেল হতে হবে। ফন্টের সাইজ এর চেয়ে কম হলে (যেমন, ১৪ পিক্সেল), iOS Safari এবং CNA ইনপুট ফিল্ড ফোকাস করার সময় স্বয়ংক্রিয়ভাবে জুম ইন করবে, যা পেজের লেআউটকে নষ্ট করে দেয় [১]।
  • ট্যাপ টার্গেট: ভুলবশত ক্লিক করা বা ব্যবহারকারীর বিরক্তি এড়াতে বোতাম, চেকবক্স এবং লিঙ্কগুলোর ন্যূনতম স্পর্শ টার্গেট এরিয়া ৪৪ পিক্সেল x ৪৪৪ পিক্সেল হতে হবে।

৫. আইনি সম্মতি এবং GDPR কমপ্লায়েন্স

গেস্ট ডেটা (যেমন- ইমেল, ফোন নম্বর বা সোশ্যাল প্রোফাইল) ক্যাপচার করার সময়, HTML স্ট্রাকচার অবশ্যই সুনির্দিষ্ট আইনি সম্মতি সমর্থন করবে। GDPR-এর অধীনে, আগে থেকে টিক চিহ্ন দেওয়া চেকবক্স বা পরোক্ষ সম্মতি বিবরণী (যেমন "লগ ইন করার মাধ্যমে আপনি আমাদের শর্তাবলীতে সম্মত হচ্ছেন") কমপ্লায়েন্ট নয় [৩]।

  • শর্তাবলী এবং গোপনীয়তা নীতির জন্য একটি ডিফল্টরূপে আনটিক করা চেকবক্স প্রদান করুন।
  • মূল লগইন ফর্মটিকে স্ক্রিনের উপরের অংশে (above the fold) রাখার জন্য বিস্তারিত আইনি টেক্সটকে একটি স্ক্রোলযোগ্য, সীমিত-উচ্চতার কন্টেইনারে (max-height: 120px; overflow-y: auto;) রাখুন।
<div class="consent-container">
    <input type="checkbox" id="terms_consent" name="terms_consent" required>
    <label for="terms_consent">
        I explicitly agree to the <a href="#" onclick="showTerms()">Terms of Service</a> and consent to the processing of my data in accordance with the <a href="#" onclick="showPrivacy()">Privacy Policy</a>.
    </label>
</div>

কাস্টম Captive Portal HTML/CSS টেমপ্লেট

নিচে একটি সম্পূর্ণ, প্রোডাকশন-রেডি, একক-ফাইলের HTML/CSS টেমপ্লেট দেওয়া হয়েছে যা সমস্ত মোবাইল-ফার্স্ট, CNA-কমপ্লায়েন্ট সর্বোত্তম অনুশীলনকে অন্তর্ভুক্ত করে। এটিতে একটি রেসপনসিভ লেআউট, একটি সিস্টেম ফন্ট স্ট্যাক, Base64-রেডি অ্যাসেট প্লেসহোল্ডার, স্পর্শ-বান্ধব ইনপুট এবং সুনির্দিষ্ট GDPR-কমপ্লায়েন্ট সম্মতি স্ট্রাকচার রয়েছে:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Guest WiFi Login</title>
    <style>
        /* CSS Reset & Variable Declarations */
        :root {
            --color-primary: #7458FD; /* Purple Brand Colour */
            --color-dark: #011638; /* Dark Blue */
            --color-light: #F5F1ED; /* Pearl White */
            --color-white: #FFFFFF;
            --color-border: #D1D5DB;
            --radius-container: 12px;
            --radius-element: 6px;
        }
        
        * {
            box-sizing: border-box;
            -webkit-tap-highlight-color: transparent;
        }
        
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
            background-color: var(--color-light);
            color: var(--color-dark);
            margin: 0;
            padding: 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
        }
        
        /* রেসপনসিভ কার্ড লেআউট */
        .portal-card {
            background-color: var(--color-white);
            width: 100%;
            max-width: 420px;
            padding: 32px 24px;
            border-radius: var(--radius-container);
            box-shadow: 0 4px 20px rgba(1, 22, 56, 0.05);
            text-align: center;
        }
        
        .logo-container {
            margin-bottom: 24px;
        }
        
        /* এমবেডেড Base64 লোগো প্লেসহোল্ডার */
        .logo {
            width: 120px;
            height: auto;
        }
        
        h1 {
            font-size: 24px;
            font-weight: 700;
            margin: 0 0 8px 0;
            color: var(--color-dark);
        }
        
        p {
            font-size: 14px;
            color: #4B5563;
            margin: 0 0 24px 0;
            line-height: 1.5;
        }
        
        /* ফর্মের স্টাইলসমূহ */
        .form-group {
            text-align: left;
            margin-bottom: 16px;
        }
        
        label {
            display: block;
            font-size: 14px;
            font-weight: 600;
            margin-bottom: 6px;
            color: var(--color-dark);
        }
        
        /* গুরুত্বপূর্ণ: iOS অটো-জুম প্রতিরোধ করতে ফন্টের আকার কমপক্ষে 16px হতে হবে */
        input[type="email"],
        input[type="text"] {
            width: 100%;
            height: 48px;
            padding: 12px 16px;
            font-size: 16px;
            border: 1px solid var(--color-border);
            border-radius: var(--radius-element);
            background-color: var(--color-white);
            color: var(--color-dark);
            outline: none;
            transition: border-color 0.2s;
        }
        
        input[type="email"]:focus,
        input[type="text"]:focus {
            border-color: var(--color-primary);
            box-shadow: 0 0 0 3px rgba(116, 88, 253, 0.15);
        }
        
        /* সম্মতি সংক্রান্ত স্টাইলসমূহ */
        .consent-group {
            display: flex;
            align-items: flex-start;
            text-align: left;
            margin: 20px 0;
        }
        
        /* স্পর্শ-বান্ধব টার্গেট সাইজিং */
        input[type="checkbox"] {
            width: 20px;
            height: 20px;
            margin: 2px 12px 0 0;
            flex-shrink: 0;
            cursor: pointer;
            accent-color: var(--color-primary);
        }
        
        .consent-label {
            font-size: 13px;
            line-height: 1.4;
            color: #4B5563;
            user-select: none;
        }
        
        .consent-label a {
            color: var(--color-primary);
            text-decoration: none;
            font-weight: 600;
        }
        
        .consent-label a:hover {
            text-decoration: underline;
        }
        
        /* Touch-Friendly CTA Button (Minimum 44px height) */
        .btn-submit {
            width: 100%;
            height: 48px;
            background-color: var(--color-primary);
            color: var(--color-white);
            border: none;
            border-radius: var(--radius-element);
            font-size: 16px;
            font-weight: 600;
            cursor: pointer;
            transition: background-color 0.2s;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .btn-submit:hover {
            background-color: #5B3EE3;
        }
        
        .btn-submit:active {
            background-color: #4A2FD4;
        }
        
        /* Legal Terms Scrollbox */
        .terms-scrollbox {
            display: none; /* Toggled via JS */
            text-align: left;
            font-size: 11px;
            color: #6B7280;
            background-color: var(--color-light);
            padding: 12px;
            border-radius: var(--radius-element);
            max-height: 100px;
            overflow-y: auto;
            margin-bottom: 16px;
            border: 1px solid var(--color-border);
        }
        
        .footer {
            margin-top: 24px;
            font-size: 11px;
            color: #9CA3AF;
        }
    </style>
</head>
<body>

    <div class="portal-card">
        <div class="logo-container">
            <!-- Replace src with your actual Base64-encoded SVG or PNG -->
            <svg class="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30">
                <rect width="100" height="30" rx="6" fill="#7458FD"/>
                <text x="50" y="20" font-family="sans-serif" font-size="12" fill="#FFFFFF" font-weight="bold" text-anchor="middle">YOUR BRAND</text>
            </svg>
        </div>
        
        <h1>অতিথি WiFi-তে স্বাগতম</h1>
        <p>সুরক্ষিত ও উচ্চ-গতির ইন্টারনেট অ্যাক্সেস পেতে অনুগ্রহ করে নিচে আপনার বিবরণ লিখুন।</p>
        
        <!-- Form must submit natively (full page navigation) to clear Apple CNA -->
        <form action="/login/submit" method="POST" onsubmit="return validateForm()">
            <div class="form-group">
                <label for="guest_name">পুরো নাম</label>
                <input type="text" id="guest_name" name="name" placeholder="John Doe" required autocomplete="name">
            </div>
            
            <div class="form-group">
                <label for="guest_email">ইমেইল ঠিকানা</label>
                <input type="email" id="guest_email" name="email" placeholder="john@example.com" required autocomplete="email">
            </div>
            
            <div class="consent-group">
                <input type="checkbox" id="terms_consent" name="terms_accepted" required>
                <label for="terms_consent" class="consent-label">
                    আমি <a href="#" onclick="toggleTerms(event)">সেবার শর্তাবলী</a> স্বীকার করছি এবং GDPR নিয়ম মেনে ডেটা প্রসেস করার সম্মতি দিচ্ছি।
                </label>
            </div>
            
            <div id="terms_box" class="terms-scrollbox">
                <strong>WiFi সেবার শর্তাবলী:</strong><br>
                ১. এই সেবাটি কোনো ওয়ারেন্টি ছাড়াই যেভাবে আছে সেভাবেই প্রদান করা হচ্ছে।<br>
                ২. ব্যবহারকারীরা কোনো অবৈধ ব্যান্ডউইথ-নিবিড় কার্যকলাপে লিপ্ত হতে পারবেন না।<br>
                ৩. আমাদের গোপনীয়তা নীতি অনুযায়ী শুধুমাত্র অথেন্টিকেশন এবং মার্কেটিং অপ্ট-ইন এর জন্য ব্যক্তিগত ডেটা সংগ্রহ করা হয়।
            </div>
            
            <button type="submit" class="btn-submit">WiFi এর সাথে যুক্ত হোন</button>
        </form>
        
        <div class="footer">
            Powered by Purple | Secure Guest WiFi
        </div>
    </div>

    <script>
        function toggleTerms(e) {
            e.preventDefault();
            var box = document.getElementById('terms_box');
            box.style.display = (box.style.display === 'block') ? 'none' : 'block';
        }
        
        function validateForm() {
            var consent = document.getElementById('terms_consent');
            if (!consent.checked) {
                alert('যুক্ত হওয়ার জন্য আপনাকে অবশ্যই সেবার শর্তাবলী স্বীকার করতে হবে।');
                return false;
            }
            return true;
        }
    </script>
</body>
</html>

ট্রাবলশুটিং ও ঝুঁকি প্রশমন

কাস্টম-কোডেড HTML/CSS Captive Portal স্থাপন করার সময়, IT অপারেশন টিমগুলো প্রায়শই কয়েকটি গুরুতর অপারেশনাল ঝুঁকির সম্মুখীন হয়:

১. SSL/TLS সার্টিফিকেট ওয়ার্নিং লুপ

যেহেতু Captive Portal ট্রাফিক ইন্টারসেপ্ট করার মাধ্যমে কাজ করে, তাই আধুনিক HTTPS ওয়েব সিকিউরিটির সাথে এদের একটি মৌলিক দ্বন্দ্ব তৈরি হয়। যখন একজন ব্যবহারকারী কোনো HTTPS সাইট (যেমন, https://www.google.com) ভিজিট করার চেষ্টা করেন, এবং গেটওয়ে সেই ট্রাফিকটিকে একটি HTTP Captive Portal-এ রিডাইরেক্ট করার চেষ্টা করে, তখন ব্রাউজার SSL সার্টিফিকেটের অমিল সনাক্ত করে এবং একটি ঝুঁকিপূর্ণ "আপনার কানেকশনটি প্রাইভেট নয়" সিকিউরিটি ওয়ার্নিং দেখায়।

  • প্রশমন: কখনোই সরাসরি HTTPS ট্রাফিক ইন্টারসেপ্ট করার চেষ্টা করবেন না। সম্পূর্ণভাবে অপারেটিং সিস্টেমের নেটিভ CNA হেল্পারের ওপর নির্ভর করুন (যা রিডাইরেক্ট ট্রিগার করতে একটি আনএনক্রিপ্টেড HTTP রিকোয়েস্ট পাঠায়)। নিশ্চিত করুন যে আপনার Captive Portal ডোমেনের একটি বৈধ, পাবলিকলি বিশ্বস্ত SSL সার্টিফিকেট রয়েছে (যেমন, Let's Encrypt বা DigiCert) এবং প্রাথমিক HTTP রিডাইরেক্ট সফলভাবে ব্যবহারকারীকে আপনার পোর্টাল ডোমেনে রাউট করার পরই কেবল সেটি HTTPS এর মাধ্যমে পরিবেশন করা হচ্ছে [2]।

২. DNS রেজোলিউশন ব্যর্থতা (The Walled Garden Trap)

আপনার কাস্টম HTML পেজটি যদি কোনো বাহ্যিক রিসোর্স নির্দেশ করে—যেমন একটি সোশ্যাল লগইন OAuth এন্ডপয়েন্ট (যেমন, Facebook, Google) বা কোনো পেমেন্ট গেটওয়ে—তবে ওয়্যারলেস কন্ট্রোলারের Walled Garden-এ স্পষ্টভাবে হোয়াইটলিস্ট না করা পর্যন্ত এই ডোমেনগুলির জন্য DNS অনুরোধগুলি ব্যর্থ হবে। যদি হোয়াইটলিস্টে কোনো ডোমেন অনুপস্থিত থাকে, তবে লগইন প্রক্রিয়াটি থমকে যাবে এবং একটি ফাঁকা স্ক্রিন দেখাবে।

  • প্রশমন: একটি কঠোর, ন্যূনতম Walled Garden তালিকা বজায় রাখুন। সোশ্যাল লগইন ব্যবহার করার সময়, আইডেন্টিটি প্রোভাইডারদের দ্বারা সুপারিশকৃত নির্দিষ্ট ওয়াইল্ডকার্ড ডোমেনগুলি হোয়াইটলিস্ট করুন (যেমন, *.google.com, *.gstatic.com)।

৩. সেশন টাইমআউট এবং MAC স্পুফিং দুর্বলতা

স্ট্যান্ডার্ড ক্যাপটিভ পোর্টালগুলি ডিভাইসের MAC অ্যাড্রেসের উপর ভিত্তি করে প্রমাণীকরণ করে। তবে, আধুনিক মোবাইল অপারেটিং সিস্টেম (iOS 14+ এবং Android 10+) ডিফল্টরূপে র্যান্ডমাইজড MAC অ্যাড্রেস (ব্যক্তিগত WiFi অ্যাড্রেস) ব্যবহার করে, যা পর্যায়ক্রমে পরিবর্তিত হয়। এর ফলে অতিথিদের বারবার পুনরায় প্রমাণীকরণ করতে বলা হতে পারে, যা ব্যবহারকারীর অভিজ্ঞতাকে নষ্ট করে [১]।

  • প্রশমন: বাসি সেশনগুলি প্রতিরোধ করতে RADIUS সার্ভারে যুক্তিসঙ্গত সেশন টাইমআউট (যেমন, ২৪ ঘণ্টা) প্রয়োগ করুন, এবং নির্বিঘ্ন, নিরাপদ অনবোর্ডিংয়ের জন্য Passpoint (Hotspot 2.0) বা WPA3-Enterprise-এর মতো আধুনিক প্রমাণীকরণ স্ট্যান্ডার্ডগুলি ব্যবহার করুন যা MAC-ভিত্তিক ক্যাপটিভ পোর্টালগুলিকে সম্পূর্ণরূপে বাইপাস করে।

Purple প্রোডাক্টের প্রাসঙ্গিকতা: নিজে তৈরি বনাম কিনে নেওয়া

যদিও একটি একক HTML পেজ কোড করা সহজ, তবুও একটি কাস্টম ক্যাপটিভ পোর্টাল পরিকাঠামো হোস্ট করা, সুরক্ষিত করা এবং স্কেল করা অত্যন্ত বড় প্রযুক্তিগত এবং কমপ্লায়েন্স সংক্রান্ত বাধা তৈরি করে। নিচের টেবিলটি একটি কাস্টম পোর্টাল নিজে হোস্ট করা বনাম Purple-এর ম্যানেজড এন্টারপ্রাইজ প্ল্যাটফর্ম ব্যবহার করার ইঞ্জিনিয়ারিং এবং অপারেশনাল বাস্তবতার তুলনা করে:

ফিচার / অপারেশনাল প্রয়োজনীয়তা নিজে হোস্ট করা কাস্টম পোর্টাল Purple এন্টারপ্রাইজ WiFi প্ল্যাটফর্ম
HTML/CSS কাস্টমাইজেশন সম্পূর্ণ ম্যানুয়াল কোডিং, একক AP বা স্থানীয় ওয়েব সার্ভারে ফাইল আপলোড করা। কাস্টম HTML/CSS ইনজেক্ট করার সুবিধাসহ পিক্সেল-পারফেক্ট ডেভেলপার এডিটর, যা একটি ড্র্যাগ-অ্যান্ড-ড্রপ ভিজ্যুয়াল বিল্ডারের সাথে সমন্বিত।
RADIUS পরিকাঠামো অত্যন্ত নির্ভরযোগ্য FreeRADIUS বা ক্লাউড RADIUS সার্ভারগুলি স্থাপন, কনফিগার এবং পরিচালনা করতে হবে [৪]। অ্যাক্টিভ-অ্যাক্টিভ রিডান্ডেন্সি এবং ৯৯.৯৯% আপটাইম SLA সহ বিল্ট-ইন, বিশ্বব্যাপী বিতরণকৃত, ক্লাউড-নেটিভ RADIUS
মাল্টি-ভেন্ডর AP সাপোর্ট প্রতিটি হার্ডওয়্যার ভেন্ডরের (Cisco, Aruba, Meraki, Ruckus) জন্য কাস্টম ইন্টিগ্রেশন স্ক্রিপ্ট প্রয়োজন [৫]। ২০০-এর বেশি হার্ডওয়্যার মডেলের সাথে নেটিভ, আউট-অফ-দ্য-বক্স ইন্টিগ্রেশন; মিশ্র-হার্ডওয়্যার এস্টেট জুড়ে ইউনিফাইড পোর্টাল ডেপ্লয়মেন্ট।
ডেটা প্রাইভেসি এবং কমপ্লায়েন্স নিরাপদ ডাটাবেস এনক্রিপশন এবং ডেটা মুছে ফেলার ওয়ার্কফ্লো সহ GDPR, CCPA এবং PCI DSS কমপ্লায়েন্সের জন্য ভেন্যু ১০০% আইনি দায়বদ্ধতা গ্রহণ করে। ডিজাইন অনুসারেই সম্পূর্ণ কমপ্লায়েন্ট। বিল্ট-ইন সম্মতি পরিচালনা, স্বয়ংক্রিয় ডেটা-বিষয়ক মুছে ফেলার অনুরোধ এবং নিরাপদ ISO 27001-প্রত্যয়িত হোস্টিং।
Identity Provider Integrations Google, Facebook, Apple এবং স্থানীয় SMS গেটওয়ের সাথে ম্যানুয়াল OAuth2 ইন্টিগ্রেশন। কর্পোরেট গেস্টদের জন্য প্রধান সোশ্যাল প্ল্যাটফর্ম, SMS গেটওয়ে এবং Azure AD / Okta-এর সাথে ওয়ান-ক্লিক ইন্টিগ্রেশন

Purple-এর প্ল্যাটফর্ম "তৈরি বনাম কেনা" (Build vs. Buy)-এর দ্বিধাদ্বন্দ্ব দূর করে। এটি ডেভেলপারদের একটি কাস্টম HTML/CSS ওয়ার্কস্পেসের সম্পূর্ণ সৃজনশীল স্বাধীনতা প্রদান করে, পাশাপাশি স্কেলে সুরক্ষিত RADIUS অথেন্টিকেশন সমর্থন করার জন্য প্রয়োজনীয় জটিল, উচ্চ-ঝুঁকিপূর্ণ ব্যাকএন্ড ইনফ্রাস্ট্রাকচার ইঞ্জিনিয়ারিং দূর করে।

ROI এবং ব্যবসায়িক প্রভাব

একটি পেশাদারভাবে তৈরি, রেসপন্সিভ কাস্টম captive portal-এ বিনিয়োগ করা আইটি অপারেশন, মার্কেটিং এবং আইনি কমপ্লায়েন্স জুড়ে পরিমাপযোগ্য রিটার্ন প্রদান করে।

১. অপারেশনাল খরচ হ্রাস (IT হেল্পডেস্ক টিকিট)

স্টেডিয়াম বা মাল্টি-সাইট রিটেইল চেইনের মতো বৃহৎ আকারের স্থাপনায়, একটি ত্রুটিপূর্ণ captive portal আইটি হেল্পডেস্কের কাজের চাপ বাড়ার অন্যতম প্রধান কারণ। গেস্টরা যখন একটি "হোয়াইট স্ক্রিন" বা অকার্যকর লগইন বোতামের সম্মুখীন হন, তখন তারা অন-সাইট কর্মীদের ওপর চাপ সৃষ্টি করেন অথবা সাপোর্ট টিকিট জমা দেন।

$$\text{বার্ষিক সাপোর্ট সাশ্রয়} = (\text{মোট বার্ষিক গেস্ট সংখ্যা} \times \text{পোর্টালের ব্যর্থতার হার} \times \text{হেল্পডেস্ক যোগাযোগের হার}) \times \text{প্রতি সাপোর্ট টিকিটের খরচ}$$

  • দৃশ্যপট: প্রতি বছর ১,০০০,০০০ ভিজিটর আসা একটি কনভেনশন সেন্টার। একটি দুর্বল কোডের পোর্টাল পুরোনো iOS ডিভাইসগুলোতে ৫% ব্যর্থতার সম্মুখীন হয়, যার ফলে ১০% হেল্পডেস্কের সাথে যোগাযোগের ঘটনা ঘটে। প্রতি সাপোর্ট টিকিটে ইন্ডাস্ট্রি-স্ট্যান্ডার্ড ১৫ ডলার খরচ ধরলে, অপারেশনাল খরচ দাঁড়ায়: $$(1,000,000 \times 0.05 \times 0.10) \times $15 = \text{বার্ষিক } $75,000 \text{ যা এড়ানো সম্ভব এমন অতিরিক্ত সাপোর্ট খরচ}$$
  • ফলাফল: একটি CNA-অপ্টিমাইজড, মোবাইল-ফার্স্ট টেমপ্লেটে স্থানান্তরিত হওয়ার মাধ্যমে পোর্টাল ব্যর্থতার হার ০.১%-এর নিচে নেমে আসে, যা কার্যত এই অপারেশনাল খরচ দূর করে।

২. মার্কেটিং ডেটা সংগ্রহ এবং অপ্ট-ইন অপ্টিমাইজেশন

রিটেইল এবং হসপিটালিটি ভেন্যুগুলোর জন্য, গেস্ট WiFi পোর্টাল হলো নির্ভুল, ফার্স্ট-পার্টি কাস্টমার ডেটা সংগ্রহের প্রাথমিক মাধ্যম। ছোট টেক্সট বা জটিল ফর্ম লেআউট সহ একটি দুর্বলভাবে ডিজাইন করা ইউজার ইন্টারফেসের কারণে উচ্চ বাউন্স রেট দেখা দেয় - ব্যবহারকারীরা লগইন প্রক্রিয়াটি সম্পূর্ণ না করেই চলে যান, যার ফলে বিপণনের সুযোগ নষ্ট হয়।

  • কেস স্টাডি (রিটেইল): একটি জাতীয় রিটেইল চেইন Purple-এর প্ল্যাটফর্ম ব্যবহার করে একটি মোবাইল-ফার্স্ট অপ্টিমাইজড captive portal চালু করেছে। একটি মাল্টি-স্টেপ লগইন ফর্মের পরিবর্তে একটি সিঙ্গেল-ফিল্ড ইমেল ইনপুট (ফন্ট-সাইজ: ১৬ পিক্সেল) এবং একটি অপ্টিমাইজড ৪৮ পিক্সেল ট্যাপ-টার্গেট বোতাম ব্যবহার করে, তারা প্রথম প্রান্তিকের মধ্যেই সম্পূর্ণ রেজিস্ট্রেশনের সংখ্যা ৪২% বৃদ্ধি এবং মার্কেটিং নিউজলেটার অপ্ট-ইন ২৮% বৃদ্ধি করতে সক্ষম হয়েছে [6]।

৩. আইনি এবং নিয়ন্ত্রক ঝুঁকি হ্রাস

GDPR এবং CCPA এর অধীনে, নীতি বহির্ভূত ডেটা সংগ্রহ অত্যন্ত কঠোর আর্থিক জরিমানা ডেকে আনে (GDPR এর অধীনে বৈশ্বিক বার্ষিক টার্নওভারের ৪% পর্যন্ত)। আপনার স্প্ল্যাশ পেজে আগে থেকে টিক চিহ্ন দেওয়া সম্মতি বক্সের ওপর নির্ভর করা বা একটি স্পষ্ট, সহজে অ্যাক্সেসযোগ্য প্রাইভেসি পলিসি প্রদান করতে ব্যর্থ হওয়া এন্টারপ্রাইজকে বিশাল আইনি ঝুঁকির মুখে ফেলে দেয়।

  • ঝুঁকি কমানোর ROI: একটি সুনির্দিষ্ট, আগে থেকে টিক চিহ্ন না দেওয়া সম্মতি বক্স এবং অপ্টিমাইজ করা স্ক্রলবক্সের মধ্যে ব্যবহারের শর্তাবলী হোস্ট করার মাধ্যমে ১০০% নিয়ন্ত্রক সম্মতি নিশ্চিত হয়, যা মিলিয়ন ডলারের আইনি জরিমানার ঝুঁকি হ্রাস করে এবং ব্র্যান্ডের সুনাম রক্ষা করে।

মূল বিষয়ের সংক্ষিপ্তসার

  • CNA স্যান্ডবক্স অত্যন্ত সীমাবদ্ধ: Apple এর iOS ওয়েবশীট এবং macOS CNA হলো অত্যন্ত কঠোরভাবে স্যান্ডবক্স করা পরিবেশ যা বাহ্যিক অ্যাসেট, কুকি এবং ওয়েব ফন্ট ব্লক করে। সমস্ত স্টাইলিং এবং অ্যাসেট অবশ্যই নিজস্ব ফাইলের ভেতরেই সীমাবদ্ধ হতে হবে (ইনলাইন CSS, Base64 ইমেজ, সিস্টেম ফন্ট) [1]।
  • AJAX প্রযুক্তি iOS এক্সিট হ্যান্ডশেককে বাধাগ্রস্ত করে: iOS ডিভাইসটিকে সফলভাবে "ক্যাপটিভ" থেকে "কানেক্টেড" অবস্থায় নিয়ে যেতে (উপরের ডানদিকের বোতামটি "Cancel" থেকে "Done" এ পরিবর্তন করতে), আপনাকে একটি ফুল-পেজ HTTP রিডাইরেক্ট ট্রিগার করতে হবে। অ্যাসিনক্রোনাস DOM আপডেট ডিভাইসটিকে একটি ক্যাপটিভ লুপের মধ্যে আটকে রাখবে।
  • মোবাইল-ফার্স্ট ডিজাইন বাধ্যতামূলক: ৯০% এরও বেশি লগইন মোবাইলে ঘটে। তাই একটি সিঙ্গেল-কলাম লেআউট (সর্বোচ্চ উইডথ: 480px) ডিজাইন করুন, টাচ-ফ্রেন্ডলি ট্যাপ টার্গেট (সর্বনিম্ন 44px x 44px) ব্যবহার করুন এবং সমস্ত টেক্সট ইনপুটে ন্যূনতম 16px ফন্ট সাইজ প্রয়োগ করুন যাতে iOS ব্রাউজারের অটোমেটিক জুমিং প্রতিরোধ করা যায়।
  • ওয়াল্ড গার্ডেনস DNS নিয়ন্ত্রণ করে: লগইনের সময় ব্যবহৃত যেকোনো বাহ্যিক ডোমেনকে (যেমন, সোশ্যাল লগইন API) অবশ্যই ওয়্যারলেস কন্ট্রোলারের ওয়াল্ড গার্ডেন তালিকায় সুনির্দিষ্টভাবে যুক্ত করতে হবে, অন্যথায় পেজটি লোড হতে ব্যর্থ হবে।
  • Purple ব্যাকএন্ডের জটিলতা দূর করে: Purple এর পোর্টাল বিল্ডার ব্যবহার করলে ডেভেলপাররা একটি কাস্টম এডিটরের মাধ্যমে সম্পূর্ণ HTML/CSS নিয়ন্ত্রণ লাভ করেন, যেখানে RADIUS, মাল্টি-ভেন্ডর AP ইন্টিগ্রেশন এবং GDPR-সম্মত ডেটাবেস ম্যানেজমেন্টের মতো বিশাল নিরাপত্তা, স্কেলিং ও কমপ্লায়েন্স সংক্রান্ত জটিলতাগুলোর দায়ভার Purple গ্রহণ করে [3]।

তথ্যসূত্র


টেকনিক্যাল ব্রিফিং শুনুন

একজন সিনিয়র সলিউশন আর্কিটেক্টের কাছ থেকে কাস্টম captive portal এর প্রযুক্তিগত সীমাবদ্ধতা এবং বাস্তবায়ন কৌশল সম্পর্কে শুনুন:

মূল সংজ্ঞাসমূহ

Captive Portal

একটি ওয়েব পেজ যা একটি WiFi নেটওয়ার্কের নতুন সংযুক্ত ব্যবহারকারীদের কাছে নেটওয়ার্ক রিসোর্সে ব্যাপক অ্যাক্সেস দেওয়ার আগে প্রদর্শিত হয়, সাধারণত প্রমাণীকরণ, অর্থপ্রদান বা পরিষেবার শর্তাবলী প্রদর্শনের জন্য ব্যবহৃত হয়।

অতিথি অ্যাক্সেস নিয়ন্ত্রণ করতে, ব্যবহারকারীর ডেটা ক্যাপচার করতে এবং আইনি কমপ্লায়েন্স প্রয়োগ করতে IT টিমগুলি গেটওয়ে স্তরে captive portals স্থাপন করে।

Captive Network Assistant (CNA)

একটি অত্যন্ত সীমাবদ্ধ, স্যান্ডবক্সড মিনি-ব্রাউজার যা একটি ক্যাপ্টভ নেটওয়ার্ক রিডাইরেক্ট সনাক্ত করার পরে অপারেটিং সিস্টেম (যেমন Apple iOS এবং macOS) দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়, যা শুধুমাত্র পোর্টাল প্রমাণীকরণের সুবিধার্থে ডিজাইন করা হয়েছে।

CNA ওয়েবভিউগুলি কঠোর সীমাবদ্ধতা আরোপ করে, যার মধ্যে বাহ্যিক CDN, স্থায়ী কুকিজ এবং স্থানীয় স্টোরেজ ব্লক করা অন্তর্ভুক্ত, যা প্রায়শই মানক ওয়েব ডিজাইনকে ব্যাহত করে।

Walled Garden

আইপি ঠিকানা, সাবনেট বা ডোমেন নামের একটি সীমাবদ্ধ তালিকা যা একজন অপ্রমাণিত অতিথি ব্যবহারকারীকে Captive Portal লগইন প্রক্রিয়া সম্পন্ন করার আগে গেটওয়ের মাধ্যমে অ্যাক্সেস করার অনুমতি দেওয়া হয়।

লগইন প্রবাহকে স্থবির হওয়া থেকে রোধ করতে ডেভেলপারদের অবশ্যই নিশ্চিত করতে হবে যে কোনও বাহ্যিক সংস্থান (যেমন সোশ্যাল লগইন API বা পেমেন্ট গেটওয়ে) walled garden-এ হোয়াইটলিস্ট করা আছে।

Base64 Encoding

একটি বাইনারি-টু-টেক্সট এনকোডিং স্কিম যা বাইনারি ডেটা (যেমন ছবি) কে একটি ASCII স্ট্রিং হিসাবে উপস্থাপন করে, যার ফলে উপাদানগুলি সরাসরি HTML বা CSS নথির মধ্যে এম্বেড করা যায়।

লোগো এবং আইকনগুলির জন্য Base64 encoding ব্যবহার করা বাহ্যিক HTTP অনুরোধগুলিকে দূর করে, যা অফলাইন CNA পরিবেশের মধ্যে উপাদানগুলি সঠিকভাবে রেন্ডার হওয়া নিশ্চিত করে।

RADIUS (Remote Authentication Dial-In User Service)

একটি নেটওয়ার্কিং প্রোটোকল যা একটি নেটওয়ার্ক পরিষেবা সংযোগ এবং ব্যবহারকারী ব্যবহারকারীদের জন্য সেন্ট্রালাইজড Authentication, Authorisation, এবং Accounting (AAA) ব্যবস্থাপনা প্রদান করে।

প্রমাণীকরণের মানদণ্ড পূরণ হয়ে গেলে নেটওয়ার্ক গেটওয়েতে অতিথির MAC ঠিকানা অনুমোদন করতে Captive Portal সার্ভারটি একটি RADIUS সার্ভারের সাথে যোগাযোগ করে।

System Font Stack

একটি CSS font-family ডিক্লেয়ারেশন যা এক্সটার্নাল ওয়েব ফন্টের চেয়ে প্রি-ইনস্টলড অপারেটিং সিস্টেম ফন্টকে (যেমন iOS-এ San Francisco, Windows-এ Segoe UI এবং Android-এ Roboto) অগ্রাধিকার দেয়।

একটি system font stack প্রয়োগ করা Google Fonts-এর মতো পরিষেবাগুলিতে ব্লক করা বাহ্যিক HTTP অনুরোধগুলি না পাঠিয়ে অবিলম্বে টাইপোগ্রাফি রেন্ডারিং নিশ্চিত করে।

Canary URL

অপারেটিং সিস্টেম বিক্রেতাদের দ্বারা রক্ষণাবেক্ষণ করা একটি ডেডিকেটেড, আনএনক্রিপ্টেড HTTP URL (যেমন, captive.apple.com) যার মাধ্যমে পরীক্ষা করা হয় যে কোনও ডিভাইসে অবাধ ইন্টারনেট সংযোগ রয়েছে কিনা।

একটি captive portal-এর উপস্থিতি সনাক্ত করতে এবং CNA ওয়েবভিউ পপআপ সক্রিয় করতে OS ব্যাকগ্রাউন্ড নেটওয়ার্ক ম্যানেজার এই URLটি চেক করে।

Passpoint (Hotspot 2.0)

Wi-Fi Alliance দ্বারা তৈরি একটি ইন্ডাস্ট্রি স্ট্যান্ডার্ড যা মোবাইল ডিভাইসগুলিকে ম্যানুয়াল captive portal লগইন ছাড়াই স্বয়ংক্রিয়ভাবে WiFi হটস্পটগুলি আবিষ্কার করতে এবং নিরাপদে প্রমাণীকরণ করতে সক্ষম করে।

এন্টারপ্রাইজগুলি অতিথিদের ঝামেলাপূর্ণ স্প্ল্যাশ পেজ থেকে নির্বিঘ্ন, সেলুলারের মতো নিরাপদ রোমিংয়ের অভিজ্ঞতায় রূপান্তর করতে Purple-এর মতো প্ল্যাটফর্মের পাশাপাশি Passpoint ব্যবহার করে।

সমাধানকৃত উদাহরণসমূহ

একটি বিলাসবহুল ২৫০টি রুম বিশিষ্ট হোটেল চেইন [Hospitality](/industries/hospitality) একটি কাস্টম গেস্ট WiFi লগইন পেজ ইমপ্লিমেন্ট করতে চায় যা তাদের প্রিমিয়াম ব্র্যান্ড গাইডের সাথে নিখুঁতভাবে মিলে যায়। তাদের ক্রিয়েটিভ এজেন্সি কাস্টম ব্র্যান্ড টাইপোগ্রাফি (Adobe Fonts-এ হোস্ট করা), একাধিক হাই-রেজোলিউশন ব্যাকগ্রাউন্ড ইমেজ (একটি পাবলিক AWS S3 বাকেটে হোস্ট করা) এবং একটি মাল্টি-স্টেপ অ্যানিমেটেড JavaScript উইজার্ড ব্যবহার করে একটি স্প্ল্যাশ পেজ ডিজাইন করেছে। ডেপ্লয় করার পর, iOS গেস্টরা SSID-এর সাথে কানেক্ট করে, কিন্তু পোর্টালটি একটি ফাঁকা সাদা স্ক্রিন হিসেবে পপ আপ হয় এবং ব্যবহারকারীরা অথেন্টিকেট করতে পারেন না।

ফাঁকা স্ক্রিন এবং ব্র্যান্ডিংয়ের ত্রুটি দূর করতে, আমাদের পোর্টালের ফ্রন্টএন্ড আর্কিটেকচারকে Apple CNA স্যান্ডবক্সের সীমাবদ্ধতার সাথে সামঞ্জস্যপূর্ণ করতে পুনর্গঠন করতে হবে:

১. টাইপোগ্রাফি সংশোধন: যেহেতু Adobe Fonts-এর জন্য একটি এক্সটার্নাল HTTP রিকোয়েস্টের প্রয়োজন হয় যা CNA দ্বারা ব্লক করা থাকে, তাই আমরা কাস্টম ফন্ট কলটি একটি নেটিভ, প্রিমিয়াম সিস্টেম ফন্ট স্ট্যাক (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;) দিয়ে প্রতিস্থাপন করেছি। এটি এক্সটার্নাল নেটওয়ার্ক কল ছাড়াই তাৎক্ষণিক রেন্ডারিং নিশ্চিত করে। ২. অ্যাসেট অপ্টিমাইজেশান: AWS S3-এ থাকা ব্যাকগ্রাউন্ড ইমেজগুলি ব্লক হয়ে যায় কারণ S3 গেটওয়ের ওয়াল্ড গার্ডেনের মধ্যে নেই। আমরা প্রাথমিক ব্র্যান্ড লোগোটি কমপ্রেস করেছি, এটিকে একটি লাইটওয়েট SVG-তে রূপান্তর করেছি এবং সরাসরি HTML-এ Base64 Data URI হিসেবে এনকোড করেছি। ব্যাকগ্রাউন্ডের জন্য, আমরা ভারী ইমেজগুলির পরিবর্তে হোটেলের ব্র্যান্ড কালার ব্যবহার করে একটি ক্লিন, রেসপনসিভ CSS গ্রেডিয়েন্ট দিয়ে প্রতিস্থাপন করেছি, যা পেজের সাইজ উল্লেখযোগ্যভাবে হ্রাস করে। ৩. JavaScript সরলীকরণ: মাল্টি-স্টেপ অ্যানিমেটেড উইজার্ডটি এক্সটার্নাল jQuery এবং GSAP লাইব্রেরির ওপর নির্ভর করে। আমরা এই এক্সটার্নাল ডিপেন্ডেন্সিগুলি বাদ দিয়েছি এবং ফর্মটিকে একটি সিঙ্গেল-পেজ, সিঙ্গেল-কলাম HTML স্ট্রাকচারে রিফ্যাক্টর করেছি। ফর্ম ভ্যালিডেশনটি লাইটওয়েট, ভ্যানিলা JavaScript-এ নতুন করে লেখা হয়েছে। ৪. অথেন্টিকেশন হ্যান্ডশেক: ফর্ম সাবমিশনটি একটি AJAX-ভিত্তিক সাবমিশন থেকে একটি নেটিভ HTML <form action="/submit" method="POST">-এ পরিবর্তন করা হয়েছে যাতে একটি ফুল-পেজ রিডাইরেক্ট ট্রিগার করা যায়, যা iOS Websheet-কে তার ক্যানারি চেক রান করতে এবং 'Done' বাটনটি প্রদর্শন করতে সাহায্য করে।

পরীক্ষকের মন্তব্য: এই পরিস্থিতিটি হাই-এন্ড ক্রিয়েটিভ ডিজাইন এবং captive webviews-এর কঠোর সিকিউরিটি সীমাবদ্ধতার মধ্যকার ক্লাসিক দ্বন্দ্বকে উপস্থাপন করে। ক্রিয়েটিভ এজেন্সিগুলি প্রায়শই captive portal-কে একটি স্ট্যান্ডার্ড ডেস্কটপ ওয়েবসাইট হিসেবে বিবেচনা করে। তবে, যেহেতু ডিভাইসটি প্রি-অথেন্টিকেটেড অবস্থায় থাকে, তাই নেটওয়ার্ক সমস্ত এক্সটার্নাল ট্রাফিক ব্লক করে দেয়। CSS ইনলাইন করে, সিস্টেম-স্ট্যাক ফন্ট ব্যবহার করে, Base64-এনকোডিং অ্যাসেট এবং নেটিভ ফর্ম সাবমিশন ব্যবহারের মাধ্যমে আমরা প্রিমিয়াম ব্র্যান্ডের নান্দনিকতা বজায় রাখি এবং একই সাথে iOS ও Android ডিভাইসে ১০০% অপারেশনাল নির্ভরযোগ্যতা অর্জন করি।

৪৫০টি স্টোর সহ একটি জাতীয় রিটেল চেইন [Retail](/industries/retail) তাদের CRM-কে সমৃদ্ধ করতে WiFi স্প্ল্যাশ পেজের মাধ্যমে গেস্টদের ইমেল সংগ্রহ করতে চায়। তারা গেস্টদের মার্কেটিং নিউজলেটারে অপ্ট-ইন করা আবশ্যক করতে চায়। প্রাথমিক ডিজাইনে একটি আগে থেকে টিক দেওয়া 'I agree to receive marketing emails' চেকবক্স রয়েছে। তদুপরি, পোর্টালটি তাদের হেডকোয়ার্টারে একটি একক লোকাল সার্ভারে হোস্ট করা হয়েছে। পিক আওয়ারে (শনিবার বিকেল), দেশজুড়ে গেস্টরা মারাত্মক বিলম্বের সম্মুখীন হন এবং অনেকেই লগইন পেজ লোড করতে পারেন না, যার ফলে ডেটা সংগ্রহের হার ব্যাপকভাবে হ্রাস পায়।

আমাদের অবশ্যই কমপ্লায়েন্স লঙ্ঘন এবং অবকাঠামোগত বাধা উভয়েরই সমাধান করতে হবে:

১. কমপ্লায়েন্স প্রতিকার: GDPR এবং CCPA এর অধীনে, আগে থেকে টিক চিহ্ন দেওয়া সম্মতি বাক্সগুলি অবৈধ। বিপণন সম্মতি চেকবক্সটি ডিফল্টরূপে আনচেক করার জন্য আমরা HTML পরিবর্তন করি (<input type="checkbox" id="marketing_consent">)। বিপণন অপ্ট-ইন থেকে আইনি সম্মতি আলাদা করতে আমরা পরিষেবার শর্তাবলীর জন্য একটি পৃথক, বাধ্যতামূলক চেকবক্সও যুক্ত করি। ২. অবকাঠামো স্কেলিং: একটি একক সেন্ট্রালাইজড সার্ভারে জাতীয় Captive Portal হোস্ট করা একটি সিঙ্গেল পয়েন্ট অফ ফেইলর এবং একটি বিশাল লেটেন্সি বাধা তৈরি করে। আমরা পোর্টাল ফ্রন্টএন্ডকে এজ-ক্যাশিং সহ একটি উচ্চ উপলব্ধতাসম্পন্ন, বিশ্বব্যাপী বিতরণ করা Content Delivery Network (CDN)-এ স্থানান্তরিত করি। ৩. RADIUS ইন্টিগ্রেশন: আমরা স্থানীয় স্টোরের অ্যাক্সেস পয়েন্টগুলিকে অ্যাক্টিভ-অ্যাক্টিভ রেডান্ডেন্সি সহ একটি ক্লাউড-নেটিভ RADIUS ক্লাস্টারের দিকে নির্দেশ করতে কনফিগার করি, যাতে সপ্তাহের সর্বোচ্চ ব্যস্ততার সময় শনিবারের ট্রাফিকের মধ্যেও ৫০ মিলিসেকেন্ডের কম লেটেন্সিতে এজ-এ স্থানীয়ভাবে প্রমাণীকরণ অনুরোধগুলি প্রক্রিয়া করা নিশ্চিত করা যায়। ৪. Purple মাইগ্রেশন: এই সমস্ত ইঞ্জিনিয়ারিং ওভারহেড দূর করতে, খুচরা বিক্রেতা Purple-এ স্থানান্তরিত হন। Purple-এর বিল্ট-ইন GDPR সম্মতি টুলিং স্বয়ংক্রিয়ভাবে কমপ্লায়েন্ট অপ্ট-ইনগুলি পরিচালনা করে, এবং তাদের বিশ্বব্যাপী বিতরণ করা ক্লাউড অবকাঠামো ৯৯.৯৯% আপটাইম সহ প্রতিদিন লক্ষ লক্ষ প্রমাণীকরণ পরিচালনা করে, যা স্কেলিং সমস্যা সম্পূর্ণরূপে সমাধান করে।

পরীক্ষকের মন্তব্য: আগে থেকে টিক চিহ্ন দেওয়া সম্মতি চেকবক্সগুলি একটি গুরুতর কমপ্লায়েন্স ঝুঁকি তৈরি করে যা বিশাল নিয়ন্ত্রক জরিমানার দিকে পরিচালিত করতে পারে। পরিষেবার শর্তাবলী থেকে বিপণন সম্মতি আলাদা করা একটি প্রযুক্তিগত এবং আইনি সর্বোত্তম অনুশীলন। অবকাঠামোগত দিক থেকে, Captive Portal-এর সেন্ট্রালাইজড হোস্টিং একটি অ্যান্টি-প্যাটার্ন। দেশব্যাপী খুচরা নেটওয়ার্কের জন্য একটি ক্লাউড-নেটিভ RADIUS ব্যাকএন্ডের সাথে যুক্ত একটি ডিসেন্ট্রালাইজড, এজ-ক্যাশড ফ্রন্টএন্ড প্রয়োজন। Purple-এর মতো একটি পরিচালিত প্ল্যাটফর্মে স্থানান্তরিত হওয়া এই আর্কিটেকচারাল জটিলতা দূর করে, যা খুচরা বিক্রেতাকে ডাটাবেস স্কেলিংয়ের পরিবর্তে বিপণন প্রচারণায় ফোকাস করার সুযোগ দেয়।

অনুশীলনী প্রশ্নসমূহ

Q1. একটি বড় আন্তর্জাতিক বিমানবন্দরের [পরিবহন](/industries/transport) IT টিম একটি কাস্টম-কোডেড captive portal স্থাপন করেছে। তারা লক্ষ্য করেন যে, Android ব্যবহারকারীরা নির্বিঘ্নে সংযুক্ত হলেও, iOS ব্যবহারকারীদের একটি বড় অংশ একটি সমস্যার সম্মুখীন হচ্ছেন যেখানে তারা সফলভাবে প্রমাণীকরণ করার পরেও ওয়েব ব্রাউজ করতে পারছেন না। নিবিড়ভাবে পরীক্ষা করার পর দেখা যায়, iOS ডিভাইসগুলি SSID-এর সাথে সংযুক্ত দেখাচ্ছে, কিন্তু captive পপআপের ডানদিকের উপরের বোতামটি এখনও 'Done'-এর পরিবর্তে 'Cancel' দেখাচ্ছে। এই সমস্যার মূল কারণ কী এবং ডেভেলপারের এটি কীভাবে সমাধান করা উচিত?

ইঙ্গিত: Apple CNA হেল্পার কীভাবে সনাক্ত করে যে একটি নেটওয়ার্ক captive অবস্থা থেকে authenticated অবস্থায় রূপান্তরিত হয়েছে এবং এই পরীক্ষাটি শুরু করার জন্য কোন ব্রাউজার অ্যাকশনের প্রয়োজন তা বিশ্লেষণ করুন।

মডেল উত্তর দেখুন

মূল কারণটি হলো, পোর্টালের সফলতার পেজটি সম্পূর্ণ-পেজ HTTP নেভিগেশনের পরিবর্তে JavaScript (AJAX/SPA রাউটিং) এর মাধ্যমে ডাইনামিকভাবে UI আপডেট করছে। Apple iOS Captive Network Assistant (CNA) মিনি-ব্রাউজার শুধুমাত্র তখনই তার ব্যাকগ্রাউন্ড সংযোগ পরীক্ষাটি (যেমন captive.apple.com-এ canary রিকোয়েস্ট) পুনরায় চালায় যখন একটি সম্পূর্ণ-পেজ URL রিডাইরেক্ট বা নেভিগেশন ঘটে। ডেভেলপার যদি AJAX-এর মাধ্যমে লগইন ফর্মটি সাবমিট করেন এবং কেবল DOM-এ একটি 'Success' বার্তা প্রদর্শন করেন, তবে CNA বুঝতে পারে না যে নেটওয়ার্কটি আনলক করা হয়েছে। ফলস্বরূপ, ডানদিকের উপরের বোতামটি 'Cancel' হিসেবেই থেকে যায়। ব্যবহারকারী যদি প্রস্থান করার জন্য 'Cancel' ক্লিক করেন, তবে OS ধরে নেয় যে লগইন ব্যর্থ হয়েছে এবং WiFi নেটওয়ার্ক থেকে সংযোগ বিচ্ছিন্ন করে দেয়।

সমাধান: ডেভেলপারকে অবশ্যই প্রমাণীকরণ সফল হওয়ার হ্যান্ডলারটি পরিবর্তন করতে হবে যাতে একটি সম্পূর্ণ-পেজ রিডাইরেক্ট বাধ্যতামূলক করা যায়। API একটি সফল প্রমাণীকরণ রেসপন্স ফেরত দেওয়ার পরে স্ট্যান্ডার্ড HTML <form action="/submit" method="POST"> এর মাধ্যমে লগইন ফর্মটি সাবমিট করে অথবা JavaScript-এ window.location.href = '/success_landing_page' কার্যকর করে এটি করা যেতে পারে। এটি প্রয়োজনীয় সম্পূর্ণ-পেজ লোডকে সক্রিয় করে, যা CNA হেল্পারকে নেটওয়ার্কের অবস্থা পুনরায় মূল্যায়ন করতে, canary URLটি এখন অ্যাক্সেসযোগ্য কিনা তা যাচাই করতে এবং ডানদিকের উপরের বোতামটি পরিবর্তন করে 'Done' করতে বাধ্য করে।

Q2. একটি স্টেডিয়াম অপারেশন টিম [ইভেন্ট] এমন একটি গেস্ট WiFi নেটওয়ার্ক চালু করতে চায় যা মার্কেটিং অপ্ট-ইন সংগ্রহ করবে। কমপ্লায়েন্স অফিসার জেদ ধরেছেন যে পোর্টালটিকে ১০০% GDPR-সম্মত হতে হবে। ডেভেলপমেন্ট টিম একটি মকআপ উপস্থাপন করে যেখানে লগইন ফর্মে একটি আগে থেকে টিক দেওয়া বক্স রয়েছে যাতে লেখা রয়েছে 'আমি পরিষেবার শর্তাবলীতে সম্মত হচ্ছি এবং মার্কেটিং নিউজলেটার পেতে সম্মতি দিচ্ছি'। কেন এই ডিজাইনটি নীতিসম্মত নয়, এবং উচ্চ কনভার্সন রেট বজায় রেখে GDPR পূরণ করতে HTML/CSS এবং ফর্মের গঠন কীভাবে রিফ্যাক্টর করা উচিত?

ইঙ্গিত: স্পষ্ট সম্মতি সম্পর্কিত GDPR-এর কঠোর প্রয়োজনীয়তা, পরিষেবার শর্তাবলী থেকে মার্কেটিং অপ্ট-ইনগুলিকে আলাদা করা এবং মোবাইলের স্ক্রিনে আইনি লেখার শারীরিক দৃশ্যমানতার বিষয়টি বিবেচনা করুন।

মডেল উত্তর দেখুন

প্রস্তাবিত ডিজাইনটি দুটি প্রধান দিক থেকে GDPR লঙ্ঘন করে: প্রথমত, আগে থেকে টিক দেওয়া চেকবক্স বৈধ সম্মতি হিসেবে গণ্য হয় না, যা অবশ্যই স্বেচ্ছায়, নির্দিষ্ট, তথ্যভিত্তিক এবং দ্ব্যর্থহীন হতে হবে। দ্বিতীয়ত, মার্কেটিংয়ের সম্মতিকে ব্যবহারের শর্তাবলির (Terms of Service) চুক্তির সাথে যুক্ত করা নিয়মসম্মত নয়; WiFi পরিষেবা ব্যবহারের শর্ত হিসেবে ব্যবহারকারীকে মার্কেটিং ইমেল গ্রহণ করতে বাধ্য করা যাবে না।

রিফ্যাক্টরিং কৌশল:

  1. সম্মতি পৃথকীকরণ: চেকবক্সটিকে দুটি আলাদা চেকবক্সে বিভক্ত করুন। চেকবক্স A বাধ্যতামূলক এবং এটি ব্যবহারের শর্তাবলি ও গোপনীয়তা নীতি কভার করে। চেকবক্স B ঐচ্ছিক এবং এটি মার্কেটিং নিউজলেটার পাওয়ার সম্মতি কভার করে।
  2. আনচেকড অবস্থায় সেট করা: HTML-এ ডিফল্টভাবে দুটি চেকবক্সই আনচেকড থাকা নিশ্চিত করুন (checked অ্যাট্রিবিউট বাদ দিয়ে)।
  3. CSS ভিজিবিলিটি: যেহেতু ৯০%-এর বেশি ব্যবহারকারী মোবাইলে রয়েছেন, তাই চেকবক্স দুটি সরাসরি 'Connect' বোতামের উপরে রাখুন যাতে স্ক্রল না করেই সেগুলি 'above the fold' দেখা যায়। পড়ার সুবিধার জন্য একটি সিস্টেম ফন্ট স্ট্যাক ব্যবহার করুন এবং লেবেলের ফন্টের আকার 14px এবং লাইন-হাইট 1.4 সেট করুন।
  4. শর্তাবলির স্ক্রলবক্স: আইনি লেখাগুলো যাতে ফর্মের এলিমেন্টগুলোকে স্ক্রিনের বাইরে ঠেলে না দেয়, সেজন্য বিস্তারিত ব্যবহারের শর্তাবলি একটি নির্দিষ্ট উচ্চতার স্ক্রলযোগ্য কন্টেইনারে রাখুন (max-height: 100px; overflow-y: auto; background-color: #F5F1ED; border: 1px solid #D1D5DB; border-radius: 6px;) যা একটি টেক্সট লিংকের মাধ্যমে ক্লিক করে খোলা বা বন্ধ করা যাবে। এটি সম্পূর্ণ আইনি সম্মতি নিশ্চিত করার পাশাপাশি লেআউটটিকে পরিচ্ছন্ন ও আকর্ষণীয় রাখে।

Q3. একটি রিটেইল চেইন [Retail](/industries/retail) ১০০টি স্টোর জুড়ে একটি কাস্টম-কোডেড স্প্ল্যাশ পেজ স্থাপন করছে। ডিজাইনার Google Fonts (Montserrat) ব্যবহার করেছেন এবং HTML head-এ একটি CDN-হোস্টেড Bootstrap স্টাইলশিটের লিংক দিয়েছেন। একটি কর্পোরেট নেটওয়ার্কে পরীক্ষা করার সময় পেজটি চমৎকারভাবে রেন্ডার হয়। তবে, একটি টেস্ট স্টোরের AP-তে Captive Portal কনফিগারেশনের সাথে স্থাপন করার সময়, পেজটি স্টাইল ছাড়া Times New Roman টেক্সট, ভাঙা অ্যালাইনমেন্ট এবং অনুপস্থিত আইকন সহ রেন্ডার হয়। এমনটি কেন ঘটে এবং অ্যাসেটগুলোকে কীভাবে রিফ্যাক্টর করতে হবে?

ইঙ্গিত: ব্যবহারকারী অথেন্টিকেট হওয়ার আগে নেটওয়ার্ক সংযোগের অবস্থা বিশ্লেষণ করুন এবং ব্রাউজার কীভাবে ওয়াল্ড গার্ডেনের বাইরের ডোমেনগুলোতে এক্সটার্নাল HTTP রিকোয়েস্ট হ্যান্ডেল করে তা নির্ধারণ করুন।

মডেল উত্তর দেখুন

এই ব্যর্থতার কারণ হলো স্প্ল্যাশ পেজটি লোড হওয়ার সময় ডিভাইসটি একটি আনঅথেন্টিকেটেড, ক্যাপটিভ অবস্থায় থাকে। এই অবস্থায়, ওয়্যারলেস গেটওয়ে সমস্ত আউটবাউন্ড ইন্টারনেট ট্রাফিক ব্লক করে দেয়, শুধুমাত্র গেটওয়ের ওয়াল্ড গার্ডেনে স্পষ্টভাবে অনুমোদিত ডোমেনগুলোতে রিকোয়েস্ট পাঠানোর অনুমতি দেয়। যেহেতু Bootstrap (cdn.jsdelivr.net) এবং Google Fonts (fonts.googleapis.com)-এর CDN ডোমেনগুলো অনুমোদিত তালিকায় নেই, তাই স্টাইলশিট এবং ফন্ট ফাইলগুলো নিয়ে আসার জন্য ব্রাউজারের রিকোয়েস্টগুলো কোনো ত্রুটির বার্তা ছাড়াই ব্যর্থ হয়। ফলস্বরূপ, ব্রাউজার তার ডিফল্ট রেন্ডারিং ইঞ্জিনে ফিরে যায়, যার ফলে স্টাইলহীন HTML (Times New Roman টেক্সট) এবং ভাঙা লেআউট তৈরি হয়।

রিফ্যাক্টরিং কৌশল:

  1. ইনলাইন CSS: এক্সটার্নাল Bootstrap স্টাইলশিট লিংকটি সরিয়ে ফেলুন। প্রয়োজনীয় CSS grid/flexbox নিয়মগুলো সরাসরি HTML-এর <head>-এর মধ্যে একটি <style> ব্লকে কপি করুন। এটি নিশ্চিত করে যে সমস্ত লেআউট নির্দেশাবলী প্রাথমিক সিঙ্গেল-পেজ পেলোডেই সরবরাহ করা হচ্ছে।
  2. সিস্টেম ফন্ট স্ট্যাক প্রয়োগ করা: Google Fonts-এর @import বা <link> কলটি সরিয়ে ফেলুন। এর পরিবর্তে CSS-এ একটি নেটিভ সিস্টেম ফন্ট স্ট্যাক ব্যবহার করুন (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;)। এটি ডিভাইসটিকে অপারেটিং সিস্টেমে আগে থেকেই ইনস্টল থাকা উচ্চ-মানের ফন্টগুলো ব্যবহার করতে বাধ্য করে, যা এক্সটার্নাল নেটওয়ার্কের প্রয়োজনীয়তা সম্পূর্ণভাবে দূর করে।
  3. আইকন/লোগো Base64 এনকোড করা: লেআউটটি যদি এক্সটার্নাল ছবি বা আইকন লাইব্রেরি (যেমন FontAwesome)-এর ওপর নির্ভর করে, তবে এই আইকনগুলোকে SVG ফরম্যাটে রূপান্তর করুন এবং HTML-এর মধ্যে ইনলাইন হিসেবে অথবা CSS-এ Base64 Data URI হিসেবে এম্বেড করুন। এটি গ্যারান্টি দেয় যে পেজটি ১০০% স্বয়ংসম্পূর্ণ এবং শূন্য ইন্টারনেট সংযোগেও নিখুঁতভাবে রেন্ডার হবে।

এই সিরিজে পড়া চালিয়ে যান

Ruijie-এর জন্য ক্যাপটিভ পোর্টাল: Purple গেস্ট WiFi-এর সাথে এটি সেট আপ করুন

কীভাবে Purple-এর ক্লাউড গেস্ট WiFi ওয়েব অথেনটিকেশন এবং RADIUS ব্যবহার করে Ruijie RG Series অ্যাক্সেস পয়েন্টের উপরে কাজ করে, যা কমান্ড লাইন থেকে কনফিগার করা হয় এবং সঠিক সেটআপ ধাপগুলো কোথায় পাওয়া যাবে।

গাইডটি পড়ুন →

B2B Captive Portals ডিজাইন করা: নিবন্ধিত নাম এবং কোম্পানির ডেটা সংগ্রহ করা

এই নির্দেশিকাটি IT ম্যানেজার এবং ভেন্যু অপারেটরদের B2B captive portals ডিজাইন করার জন্য একটি ভেন্ডর-নিরপেক্ষ প্রযুক্তিগত কাঠামো প্রদান করে। এটি নিবন্ধিত নাম এবং কোম্পানির ডেটা ক্যাপচার করার জন্য কীভাবে রেজিস্ট্রেশন ফিল্ড গঠন করা যায় তা বিস্তারিত ব্যাখ্যা করে, যা GDPR সম্মতি বজায় রেখে এবং অ্যাকাউন্ট-স্তরের ইন্টেলিজেন্স তৈরি করার পাশাপাশি উচ্চ সমাপ্তির হার নিশ্চিত করে।

গাইডটি পড়ুন →

ক্যাপটিভ পোর্টাল আর্কিটেকচার: নিরাপত্তা, রিডাইরেকশন এবং সর্বোত্তম অনুশীলনসমূহ

এন্টারপ্রাইজ ক্যাপটিভ পোর্টাল আর্কিটেকচারের উপর একটি সুনির্দিষ্ট প্রযুক্তিগত রেফারেন্স। এই গাইডটি সুরক্ষিত, ডেটা-সমৃদ্ধ গেস্ট WiFi নেটওয়ার্ক স্থাপনকারী IT লিডারদের জন্য নেটওয়ার্ক আইসোলেশন, DNS রিডাইরেকশন, RADIUS অথেন্টিকেশন এবং সিকিউরিটি কমপ্লায়েন্স উন্মোচন করে।

গাইডটি পড়ুন →