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

Custom Captive Portal: HTML এবং CSS গাইড

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

📖 11 মিনিট পাঠ📝 2,731 শব্দ🔧 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 portal-এর সবচেয়ে বড় কারণ। ডেভেলপাররা তাদের Android ফোনে টেস্ট করেন, সবকিছু চমৎকার দেখায়, এবং তারপর হোটেলের iPhone ব্যবহারকারী অতিথিরা আনস্টাইলড টেক্সট সহ একটি সাদা স্ক্রিন দেখতে পান। তাই চলুন ডিফেন্সিভ কোডিং কীভাবে করতে হয় তা নিয়ে আলোচনা করি। captive portal HTML এবং CSS-এর সুবর্ণ নিয়মটি হলো: পেজটিকে এমনভাবে বিবেচনা করুন যেন এতে কোনো ইন্টারনেট কানেকশন নেই। কারণ অথেন্টিকেশন পর্ব চলাকালীন, আসলেই কোনো কানেকশন থাকে না। নেটওয়ার্কটি ক্যাপটিভ থাকে। আপনার পেজটি কোনো এক্সটার্নাল URL থেকে যে রিসোর্সই লোড করার চেষ্টা করুক না কেন — যেমন একটি Google Font, একটি CDN-হোস্টেড স্টাইলশিট, একটি JavaScript লাইব্রেরি, একটি লোগো ইমেজ — তা নীরবে ব্যর্থ হবে অথবা একটি লোডিং স্পিনার দেখাবে যা কখনই শেষ হবে না।HTML স্ট্রাকচার দিয়ে শুরু করা যাক। আপনার ডকুমেন্টটি একটি পরিচ্ছন্ন HTML5 পেজ হওয়া উচিত। হেডের (head) মধ্যে, আপনার একটি ভিউপোর্ট মেটা ট্যাগ প্রয়োজন যার কনটেন্ট সেট করা থাকবে width equals device-width এবং initial-scale equals one। মোবাইল রেন্ডারিংয়ের জন্য এটি অত্যন্ত আবশ্যক। এটি ছাড়া, iOS পেজটিকে ৯৮০ পিক্সেল চওড়া হিসেবে রেন্ডার করবে এবং এটিকে ছোট করে দেখাবে, যার ফলে সবকিছু অতি ক্ষুদ্র দেখাবে। আপনার CSS অবশ্যই ইনলাইন হতে হবে — হয় হেড এলিমেন্টের ভেতরে একটি স্টাইল ব্লকে, অথবা ব্যক্তিগত এলিমেন্টগুলোতে ইনলাইন স্টাইল অ্যাট্রিবিউট হিসেবে। লিঙ্ক ট্যাগের মাধ্যমে যুক্ত কোনো এক্সটার্নাল স্টাইলশিট ব্যবহার করবেন না। সেই স্টাইলশিটটি আপনার সার্ভারে থাকে, যা অথেন্টিকেশনের সময় Captive Portal অ্যাক্সেস করতে পারে না। ফলে পেজটি সম্পূর্ণ স্টাইল ছাড়া রেন্ডার হবে। ফন্টের জন্য, একটি সিস্টেম ফন্ট স্ট্যাক ব্যবহার করুন। যেমন: 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 ১৬ পিক্সেলের কম ফন্ট-সাইজ বিশিষ্ট যেকোনো ইনপুট ফিল্ডকে স্বয়ংক্রিয়ভাবে জুম করবে, যা আপনার যত্নসহকারে তৈরি করা লেআউটটিকে নষ্ট করে দেয়। ফন্ট-সাইজ ১৬ পিক্সেল বা তার বেশি সেট করলে এই জুম হওয়া প্রতিরোধ করা যায়। আইনি সম্মতি (legal consent) বিভাগটির প্রতি বিশেষ মনোযোগ দেওয়া প্রয়োজন। GDPR-এর অধীনে, আপনি যদি ব্যক্তিগত তথ্য সংগ্রহ করেন — এমনকি শুধুমাত্র একটি ইমেল ঠিকানাও — তবে আপনার স্পষ্ট, অবহিত সম্মতি প্রয়োজন। এর অর্থ হলো একটি চেকবক্স যা ডিফল্টভাবে আনচেক করা থাকবে এবং সাথে একটি দৃশ্যমান লেবেল থাকবে যা স্পষ্টভাবে উল্লেখ করবে ব্যবহারকারী কিসে সম্মতি দিচ্ছেন। চেকবক্সটি আগে থেকে টিক দিয়ে রাখবেন না। সম্মতির চেকবক্সটি স্ক্রোল না করেই স্পষ্টভাবে দৃশ্যমান হতে হবে। এখন, বিশেষভাবে iOS CNA-এর জন্য একটি অত্যন্ত গুরুত্বপূর্ণ ইমপ্লিমেন্টেশন ডিটেইল। ব্যবহারকারী যখন অথেন্টিকেশন সম্পন্ন করেন, তখন CNA মনিটর করে যে Captive Portal ডোমেনটি অ্যাক্সেসযোগ্য হয়েছে কিনা। এই পরীক্ষাটি ফুল পেজ নেভিগেশনের মাধ্যমে ট্রিগার হয়, জাভাস্ক্রিপ্ট AJAX কলের মাধ্যমে নয়। এর মানে হল আপনি যদি এমন একটি সিঙ্গেল-পেজ অ্যাপ তৈরি করেন যা fetch বা XMLHttpRequest-এর মাধ্যমে ফর্ম সাবমিট করে এবং ফুল পেজ রিডাইরেক্ট ছাড়াই DOM আপডেট করে, তবে CNA কখনই সনাক্ত করতে পারবে না যে অথেন্টিকেশন সম্পন্ন হয়েছে। অথেন্টিকেশনের পরে আপনাকে অবশ্যই একটি নতুন URL-এ রিডাইরেক্ট করতে হবে — একটি সম্পূর্ণ HTTP রিডাইরেক্ট, কোনো জাভাস্ক্রিপ্ট DOM ম্যানিপুলেশন নয়। এটি Captive Portal ডেভেলপমেন্টের সবচেয়ে সাধারণ ভুলগুলোর একটি। জাভাস্ক্রিপ্টের ক্ষেত্রে, এটি যতটা সম্ভব মিনিমাল রাখুন। CNA-তে সীমিত JS সাপোর্ট রয়েছে এবং localStorage বা sessionStorage-এ কোনো অ্যাক্সেস নেই। CNA বন্ধ হয়ে গেলে কুকিজ ধ্বংস হয়ে যায়। এই ব্রাউজার API-গুলোর ওপর নির্ভরশীল যেকোনো স্টেট ম্যানেজমেন্ট ব্যর্থ হবে। ভ্যানিলা জাভাস্ক্রিপ্ট ইভেন্ট লিসেনারগুলো ঠিকঠাক কাজ করবে। jQuery হল একটি ৩০-কিলোবাইটের এক্সটার্নাল ডিপেন্ডেন্সি যা লোড হতে ব্যর্থ হবে। [ইমপ্লিমেন্টেশন সুপারিশ এবং সম্ভাব্য ভুলত্রুটি] আমি আপনাকে প্র্যাক্টিক্যাল ইমপ্লিমেন্টেশনের একটি চেকলিস্ট দিচ্ছি। প্রথমত: ভিউপোর্ট মেটা ট্যাগ, সবসময়। দ্বিতীয়ত: সমস্ত CSS ইনলাইন, কোনো এক্সটার্নাল স্টাইলশিট নয়। তৃতীয়ত: সমস্ত ইমেজ হয় Captive Portal সার্ভার থেকে পরিবেশন করতে হবে অথবা Base64-এনকোডেড হতে হবে। চতুর্থত: সিস্টেম ফন্ট স্ট্যাক, কোনো ওয়েব ফন্ট নয়। পঞ্চমত: সমস্ত ইনপুট ফিল্ডে ন্যূনতম ১৬ পিক্সেল ফন্ট সাইজ। ষষ্ঠত: টাচ-ফ্রেন্ডলি ট্যাপ টার্গেট, ন্যূনতম ৪৪ বাই ৪৪ পিক্সেল। সপ্তমত: সিঙ্গেল কলাম লেআউট, সর্বোচ্চ প্রস্থ ৪৮০ পিক্সেল। অষ্টমত: অথেন্টিকেশনের পর ফুল পেজ রিডাইরেক্ট, কোনো জাভাস্ক্রিপ্ট স্টেট আপডেট নয়। নবমত: GDPR-সম্মত সম্মতি চেকবক্স, যা ডিফল্টভাবে আনচেক করা থাকবে। দশমত: ব্রাউজার প্রিভিউ নয়, বরং একটি আসল captive নেটওয়ার্ক ব্যবহার করে একটি আসল iOS ডিভাইসে পরীক্ষা করুন। প্রোডাকশনে আমি সবচেয়ে বেশি যে ভুলগুলো দেখতে পাই। নম্বর এক: Google Fonts — ইম্পোর্টটি সরিয়ে ফেলুন, এটি ব্যর্থ হবে। নম্বর দুই: এক্সটার্নাল জাভাস্ক্রিপ্ট লাইব্রেরি — Bootstrap, jQuery, যেকোনো CDN-হোস্টেড স্ক্রিপ্ট ব্যর্থ হবে। নম্বর তিন: এক্সটার্নাল স্টাইলশিটে ডিক্লেয়ার করা CSS ভেরিয়েবল — এগুলো অবশ্যই আপনার ইনলাইন স্টাইল ব্লকে থাকতে হবে। নম্বর চার: URL দ্বারা রেফারেন্স করা ব্যাকগ্রাউন্ড ইমেজ — এগুলোকে Base64 এনকোড করুন। নম্বর পাঁচ: পোস্ট-অথেন্টিকেশন রিডাইরেক্ট ছাড়া AJAX ফর্ম সাবমিশন — CNA অথেন্টিকেশন সম্পন্ন হওয়ার বিষয়টি সনাক্ত করতে পারবে না। এখন, নিজে তৈরি করা বনাম কিনে নেওয়ার বিষয়ে একটি সৎ আলোচনা করা যাক। স্ক্র্যাচ থেকে একটি কাস্টম Captive Portal তৈরি করার অর্থ হল আপনি ব্যাকএন্ড ইনফ্রাস্ট্রাকচারের জন্যও দায়ী — 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 Portal হলো একটি সীমাবদ্ধ ওয়েব পরিবেশ, কোনো স্ট্যান্ডার্ড ব্রাউজার প্রসঙ্গ নয়। Apple CNA এবং Android ওয়েবভিউগুলো বাহ্যিক রিসোর্স, কুকিজ, JavaScript এবং সেশন স্টেটের ওপর কঠোর সীমাবদ্ধতা আরোপ করে। এর সমাধান হলো ইনলাইন CSS, সিস্টেম ফন্ট, Base64-এনকোড করা ইমেজ এবং অথেন্টিকেশনের পর ফুল-পেজ রিডাইরেক্ট সহ সেলফ-কন্টেইন্ড HTML পেজ তৈরি করা। ভেন্যু অপারেটর এবং IT টিমগুলোর জন্য যারা তাদের বিকল্পগুলো মূল্যায়ন করছেন: আপনার প্রয়োজনীয়তা যদি কাস্টম HTML এবং CSS সহ একটি সম্পূর্ণ ব্র্যান্ডেড, বেসপোক পোর্টাল হয়, তবে পছন্দটি হলো সম্পূর্ণ স্ট্যাকটি নিজেই তৈরি করা এবং রক্ষণাবেক্ষণ করা — যা একটি বড় ইঞ্জিনিয়ারিং প্রতিশ্রুতি — অথবা Purple-এর মতো একটি প্ল্যাটফর্ম ব্যবহার করা যা একটি প্রোডাকশন-গ্রেড ব্যাকএন্ড ইনফ্রাস্ট্রাকচারের ওপর কাস্টম HTML এবং CSS এডিটিং সুবিধা প্রদান করে। এখান থেকে পরবর্তী পদক্ষেপগুলো হলো: Purple-এর পোর্টাল এডিটর ডকুমেন্টেশন পর্যালোচনা করুন, আজ আমরা যে মোবাইল-ফার্স্ট চেকলিস্টটি আলোচনা করেছি তার বিপরীতে আপনার বিদ্যমান পোর্টালটি অডিট করুন, এবং আপনি যদি একদম শুরু থেকে শুরু করেন, তবে আমাদের আউটলাইন করা HTML টেমপ্লেট স্ট্রাকচারটি আপনার বেসলাইন হিসেবে ব্যবহার করুন। শোনার জন্য ধন্যবাদ, এবং পরবর্তী ব্রিফিংয়ে আপনার সাথে দেখা হবে।

header_image.png

Executive Summary

For enterprise venues—ranging from luxury hotels Hospitality and retail chains Retail to transit hubs Transport and modern medical campuses Healthcare —the guest WiFi splash page is the digital front door. However, over 90% of guest WiFi logins occur on mobile devices, where rendering is governed not by standard browsers like Safari or Chrome, but by highly restricted Captive Network Assistant (CNA) webviews [1]. These "mini-browsers" enforce severe sandbox limitations: they block external CDNs, disable persistent cookies, ignore external web fonts, and severely restrict JavaScript execution to mitigate security risks and prevent session hijacking [2].

When a developer designs a splash page using traditional web standards, these constraints result in broken layouts, missing brand assets, and non-functional login buttons, directly impacting customer satisfaction and digital engagement. This guide provides solutions to these challenges, presenting defensive coding practices—such as inline CSS, Base64 asset encoding, system font stacks, and explicit navigation-driven authentication handshakes—to ensure seamless cross-platform rendering. Furthermore, we examine how utilising a managed solution like Purple's portal builder allows developers to maintain complete HTML/CSS creative control while offloading RADIUS authentication, database scaling, GDPR/PCI compliance, and multi-vendor AP integrations [3].

Technical Deep-Dive

To build a resilient custom captive portal, developers must understand the network-level interception and browser virtualisation that occurs when a guest associates with an open Service Set Identifier (SSID).

The Captive Portal Lifecycle

When a client device associates with a captive SSID, the following sequence is triggered:

  1. IP Association: The device completes a 3-way handshake and requests an IP address via DHCP.
  2. Active Connectivity Probe: The operating system's background network manager immediately sends an HTTP GET request to a dedicated vendor-neutral canary URL (e.g., Apple's http://captive.apple.com/hotspot-detect.html or Google's http://connectivitycheck.gstatic.com/generate_204) [1].
  3. DNS/HTTP Interception: The local Wireless LAN Controller (WLC) or Access Point (AP) intercepts this port 80 HTTP request. Instead of returning the expected HTTP 200 or 204 status, the gateway redirects the client's traffic to the captive portal's landing page URL via an HTTP 302 redirect [2].
  4. Webview Spawning: Detecting the redirect, the OS spawns its native Captive Network Assistant (CNA) mini-browser to display the redirected splash page, bypassing the need for the user to manually open a full browser.
  5. Authentication and State Transition: The user completes the login form, submitting credentials back to the portal server, which instructs the gateway (often via a RADIUS Access-Accept or external API call) to authorise the MAC address.
  6. CNA Exit Handshake: The CNA mini-browser performs another HTTP GET to its canary URL. If it receives the expected 200/204 response, it changes its top-right button from "Cancel" to "Done" and establishes the WiFi connection as the primary network interface.

Platform-Specific Mini-Browser Constraints

Each operating system handles this lifecycle within different webview environments, resulting in highly fragmented behaviour. The table below details these critical constraints:

Platform / Webview Display Method Persistent Cookies External Web Fonts JavaScript Execution Window Dimensions Exit Handshake Trigger
Apple iOS CNA (Websheet) Mini-Browser Popup Blocked (Destroyed on close) Blocked (Offline) Limited (No localStorage/sessionStorage) Responsive (Device-width) Full-page HTTP Redirect Only [1]
Apple macOS CNA (Captive Network Assistant) Mini-Browser Popup Blocked Blocked Limited (No alert/confirm dialogs) Fixed (900px x 572px) Full-page HTTP Redirect Only
Android (Google) (CaptivePortalLogin) Push Notification -> Chrome Custom Tab Allowed (Shared with Chrome) Allowed (If whitelisted in walled garden) Full Responsive Automatic (Captive Portal API / 204 Check) [2]
Samsung Android (Samsung Internet) Push Notification -> Mini-Browser Allowed Allowed Full Responsive Automatic
Windows 10/11 (Default Browser) Auto-Launch Default Browser Allowed (Full browser context) Allowed Full Responsive Manual / Automatic

cna_constraints_comparison.png

Coding Around the Apple CNA "Done" Button Trap

One of the most frequent failure modes in custom portal development is the "Done" Button Trap on iOS devices. When a user authenticates, the iOS Websheet webview must detect that the network is no longer captive. It does this by monitoring the success of its background canary requests.

Crucially, the iOS CNA will only trigger this check upon a full-page HTTP navigation (location redirect). If a developer builds a modern Single Page Application (SPA) that submits form data via an asynchronous AJAX call (e.g., fetch() or Axios) and updates the DOM dynamically without changing the URL, the CNA will never re-run its connectivity check. The user will be authenticated at the gateway level, but the CNA button in the top-right corner will remain as "Cancel". If the frustrated user clicks "Cancel", the iOS device will immediately disassociate from the SSID, terminating the WiFi session [1].

To prevent this, the authentication success handler must perform a full-page redirect to a physical landing page (e.g., window.location.href = '/success') or submit the login form natively via a standard HTTP POST action.

Implementation Guide

To ensure consistent rendering across all platforms, developers must transition from modern, asset-heavy web design to a highly self-contained, defensive coding style.

The Golden Rule: Design for Zero Internet Connectivity

During the captive state, the client device has no access to the wider internet. It can only resolve and access IP addresses and domains explicitly whitelisted in the wireless controller's Walled Garden (such as the IP of the captive portal server itself). Therefore, any external asset referenced in your HTML will fail to load, resulting in a broken layout.

To design defensively, implement the following Mobile-First Captive Portal Design Checklist:

mobile_first_checklist.png

1. Viewport Configuration

To prevent mobile devices from scaling down the viewport to a desktop width (typically 980px), the HTML `` must include a responsive viewport meta tag. Without this, text and input fields will appear microscopic on mobile devices:


2. Inlining CSS and Removing External Dependencies

Never link to external CSS files or CDNs (e.g., Bootstrap, Tailwind, or Google Fonts). All CSS must be embedded within a `

<div class="portal-card">
    <div class="logo-container">
        
        
            
            YOUR BRAND
        
    </div>
    
    <h1>Welcome to Guest WiFi</h1>
    <p>Please enter your details below to gain secure, high-speed internet access.</p>
    
    
    
        <div class="form-group">
            Full Name
            
        </div>
        
        <div class="form-group">
            Email Address
            
        </div>
        
        <div class="consent-group">
            
            
                I accept the <a href="#">Terms of Service</a> and consent to data processing in compliance with GDPR regulations.
            
        </div>
        
        <div id="terms_box" class="terms-scrollbox">
            <strong>WiFi Terms of Service:</strong><br />
            1. This service is provided as-is without warranties.<br />
            2. Users must not engage in illegal bandwidth-intensive activities.<br />
            3. Personal data is collected solely for authentication and marketing opt-ins in compliance with our Privacy Policy.
        </div>
        
        Connect to WiFi
    
    
    <div class="footer">
        Powered by Purple | Secure Guest WiFi
    </div>
</div>

## Troubleshooting &amp; Risk Mitigation

When deploying custom-coded HTML/CSS captive portals, IT operations teams frequently encounter several severe operational risks:

### 1. The SSL/TLS Certificate Warning Loop

Because captive portals function by intercepting traffic, they present a fundamental conflict with modern HTTPS web security. When a user attempts to visit an HTTPS site (e.g., `https://www.google.com`), and the gateway attempts to redirect that traffic to an HTTP captive portal, the browser detects a mismatch in the SSL certificate and displays a critical "Your connection is not private" security warning. 

* **Mitigation**: Never attempt to intercept HTTPS traffic directly. Rely entirely on the operating system's native CNA helper (which makes an unencrypted HTTP request to trigger the redirect). Ensure your captive portal's domain has a valid, publicly trusted SSL certificate (e.g., Let's Encrypt or DigiCert) and is served over HTTPS *only after* the initial HTTP redirect has successfully routed the user to your portal domain [2].

### 2. DNS Resolution Failures (The Walled Garden Trap)

If your custom HTML page references external resources—such as a social login OAuth endpoint (e.g., Facebook, Google) or a payment gateway—the DNS requests for these domains will fail unless they are explicitly whitelisted in the wireless controller's Walled Garden. If a domain is missing from the whitelist, the login flow will stall, presenting a blank screen.

* **Mitigation**: Maintain a strict, minimal Walled Garden list. If utilising social logins, whitelist the specific wildcard domains recommended by the identity providers (e.g., `*.google.com`, `*.gstatic.com`). 

### 3. Session Timeout and MAC Spoofing Vulnerabilities

Standard captive portals authenticate devices based on their MAC addresses. However, modern mobile operating systems (iOS 14+ and Android 10+) utilise randomised MAC addresses (private WiFi addresses) by default, rotating them periodically. This can lead to guests being repeatedly prompted to re-authenticate, destroying the user experience [1].

* **Mitigation**: Implement reasonable session timeouts (e.g., 24 hours) on the RADIUS server to prevent stale sessions, and utilise modern authentication standards like **Passpoint (Hotspot 2.0)** or **WPA3-Enterprise** for seamless, secure onboarding that bypasses MAC-based captive portals entirely.

## Purple Product Relevance: Build vs. Buy

While coding a single HTML page is straightforward, hosting, securing, and scaling a custom captive portal infrastructure presents massive technical and compliance hurdles. The table below compares the engineering and operational realities of self-hosting a custom portal versus utilising Purple's managed enterprise platform:

| Feature / Operational Requirement | Self-Hosted Custom Portal | Purple Enterprise WiFi Platform |
| :--- | :--- | :--- |
| **HTML/CSS Customisation** | Fully manual coding, uploading files to individual APs or local web servers. | **Pixel-perfect developer editor** allowing custom HTML/CSS injects, combined with a drag-and-drop visual builder.
| **RADIUS Infrastructure** | Must deploy, configure, and maintain highly available FreeRADIUS or Cloud RADIUS servers [4]. | **Built-in, globally distributed, cloud-native RADIUS** with active-active redundancy and 99.99% uptime SLAs.
| **Multi-Vendor AP Support** | Custom integration scripts required for each hardware vendor (Cisco, Aruba, Meraki, Ruckus) [5]. | **Native, out-of-the-box integration** with over 200 hardware models; unified portal deployment across mixed-hardware estates.
| **Data Privacy &amp; Compliance** | Venue assumes 100% legal liability for GDPR, CCPA, and PCI DSS compliance, including secure database encryption and data deletion workflows. | **Fully compliant by design**. Built-in consent management, automated data-subject deletion requests, and secure ISO 27001-certified hosting.
| **Analytics &amp; Marketing** | Requires building custom data ingestion pipelines and integrating third-party marketing tools. | **Enterprise-grade analytics dashboard** with real-time footfall tracking, return-rate metrics, and automated marketing campaign triggers [6].
| **Identity Provider Integrations** | Manual OAuth2 integrations with Google, Facebook, Apple, and local SMS gateways. | **One-click integrations** with major social platforms, SMS gateways, and Azure AD / Okta for corporate guests.

Purple's platform resolves the "Build vs. Buy" dilemma. It provides developers with the complete creative freedom of a custom HTML/CSS workspace while eliminating the complex, high-risk backend infrastructure engineering required to support secure RADIUS authentication at scale.

## ROI &amp; Business Impact

Investing in a professionally engineered, responsive custom captive portal delivers quantifiable returns across IT operations, marketing, and legal compliance.

### 1. Operational Cost Reduction (IT Helpdesk Tickets)

In large-scale deployments, such as a stadium or multi-site retail chain, a broken captive portal is a leading driver of IT helpdesk escalations. When guests encounter a "white screen" or a non-responsive login button, they overwhelm on-site staff or submit support tickets.

$$\text{Annual Support Savings} = (\text{Total Annual Guest Visits} \times \text{Portal Failure Rate} \times \text{Helpdesk Contact Rate}) \times \text{Cost Per Support Ticket}$$

* **Scenario**: A convention centre with 1,000,000 annual visitors. A poorly coded portal has a 5% failure rate on older iOS devices, leading to a 10% helpdesk contact rate. At an industry-standard $15 per support ticket, the operational cost is:
  $$(1,000,000 \times 0.05 \times 0.10) \times \$15 = \$75,000 \text{ annually in avoidable support overhead}$$
* **Outcome**: Transitioning to a CNA-optimised, mobile-first template reduces the portal failure rate to &lt;0.1%, virtually eliminating this operational drain.

### 2. Marketing Data Capture and Opt-in Optimisation

For retail and hospitality venues, the guest WiFi portal is the primary mechanism for capturing clean, first-party customer data. A poorly designed user interface with microscopic text or a clunky form layout causes high **bounce rates**—users abandon the login process entirely, resulting in lost marketing opportunities.

* **Case Study (Retail)**: A national retail chain implemented a mobile-first optimised captive portal utilising Purple's platform. By replacing a multi-step login form with a single-field email input (font-size: 16px) and an optimised 48px tap-target button, they saw a **42% increase in completed registrations** and a **28% increase in marketing newsletter opt-ins** within the first quarter [6].

### 3. Legal and Regulatory Risk Mitigation

Under GDPR and CCPA, non-compliant data collection carries severe financial penalties (up to 4% of global annual turnover under GDPR). Relying on pre-ticked checkboxes or failing to provide a clear, easily accessible Privacy Policy on your splash page exposes the enterprise to immense legal liability.

* **Mitigation ROI**: Implementing an explicit, un-ticked consent checkbox and hosting terms within an optimised scrollbox ensures 100% regulatory compliance, mitigating the risk of multi-million dollar regulatory fines and protecting brand reputation.

## Summary of Key Takeaways

* **The CNA Sandbox is Restrictive**: Apple's iOS Websheet and macOS CNA are highly sandboxed environments that block external assets, cookies, and web fonts. All styling and assets must be self-contained (inline CSS, Base64 images, system fonts) [1].
* **AJAX Breaks the iOS Exit Handshake**: To successfully transition the iOS device from "captive" to "connected" (changing the top-right button from "Cancel" to "Done"), you must trigger a full-page HTTP redirect. Asynchronous DOM updates will leave the device in a captive loop.
* **Mobile-First is Mandatory**: Over 90% of logins occur on mobile. Design a single-column layout (max-width: 480px), utilise touch-friendly tap targets (minimum 44px x 44px), and enforce a minimum 16px font size on all text inputs to prevent automatic iOS browser zooming.
* **Walled Gardens Control DNS**: Any external domain referenced during login (e.g., social login APIs) must be explicitly whitelisted in the wireless controller's walled garden, or the page will fail to load.
* **Purple Eliminates Backend Complexity**: Utilising Purple's portal builder gives developers complete HTML/CSS control via a custom editor, while offloading the immense security, scaling, and compliance burdens of RADIUS, multi-vendor AP integrations, and GDPR-compliant database management [3].

## References

* [1] [Wireless Broadband Alliance: Captive Network Portal Behaviour](https://captivebehavior.wballiance.com/)
* [2] [Android Open Source Project: Captive Portal Login Webview Integration](https://source.android.com/docs/core/connect/android-custom-tabs-captive-portal)
* [3] [European Data Protection Board: Guidelines on Consent under Regulation 2016/679](https://edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en)
* [4] [How to Implement 802.1X Authentication with Cloud RADIUS](/guides/implementing-8021x-with-cloud-radius)
* [5] [Cisco Wireless APs: 2026 Guide to Products &amp; Deployment](/blog/cisco-wireless-ap)
* [6] [Purple WiFi Marketing &amp; Analytics Platform](/guest-wifi-marketing-analytics-platform)

---

## Listen to the Technical Briefing

Listen to a senior solutions architect discuss the technical constraints and implementation strategies for custom captive portals:

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

Captive Portal

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

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

Captive Network Assistant (CNA)

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

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

Walled Garden

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

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

Base64 Encoding

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

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

RADIUS (Remote Authentication Dial-In User Service)

একটি নেটওয়ার্কিং প্রোটোকল যা একটি নেটওয়ার্ক পরিষেবা সংযোগকারী এবং ব্যবহারকারী গ্রাহকদের জন্য কেন্দ্রীভূত প্রমাণীকরণ, অনুমোদন এবং অ্যাকাউন্টিং (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) যা পরীক্ষা করে যে একটি ডিভাইসে অবাধ ইন্টারনেট সংযোগ রয়েছে কিনা।

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

Passpoint (Hotspot 2.0)

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

এন্টারপ্রাইজগুলি 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 Portal ওয়েবভিউ-এর কঠোর সিকিউরিটি সীমাবদ্ধতার মধ্যে ক্লাসিক দ্বন্দ্বকে উপস্থাপন করে। ক্রিয়েটিভ এজেন্সিগুলি প্রায়শই Captive Portal-কে একটি স্ট্যান্ডার্ড ডেস্কটপ ওয়েবসাইট হিসেবে বিবেচনা করে। তবে, ডিভাইসটি প্রি-অথেন্টিকেটেড অবস্থায় থাকার কারণে, নেটওয়ার্ক সমস্ত এক্সটার্নাল ট্রাফিক ব্লক করে দেয়। CSS ইনলাইন করে, সিস্টেম-স্ট্যাক ফন্ট ব্যবহার করে, Base64-এনকোডিং অ্যাসেট এবং নেটিভ ফর্ম সাবমিশন ব্যবহার করে, আমরা iOS এবং Android ডিভাইসে ১০০% অপারেশনাল নির্ভরযোগ্যতা অর্জনের পাশাপাশি প্রিমিয়াম ব্র্যান্ডের নান্দনিকতা বজায় রাখি।

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

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

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

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

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

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

ইঙ্গিত: Apple CNA helper কীভাবে সনাক্ত করে যে একটি নেটওয়ার্ক 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 নেটওয়ার্ক থেকে ডিসকানেক্ট করে দেয়।

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

Q2. একটি স্টেডিয়াম অপারেশন টিম [Events] একটি গেস্ট WiFi নেটওয়ার্ক চালু করতে চায় যা মার্কেটিং অপ্ট-ইন সংগ্রহ করবে। কমপ্লায়েন্স অফিসার জোর দিয়ে বলেছেন যে পোর্টালটি অবশ্যই ১০০% GDPR-compliant হতে হবে। ডেভেলপমেন্ট টিম একটি মকআপ উপস্থাপন করেছে যেখানে লগইন ফর্মে একটি প্রি-চেকড বক্স রয়েছে যাতে লেখা আছে 'I agree to the Terms of Service and consent to receive marketing newsletters'। এই ডিজাইনটি কেন নন-কমপ্লায়েন্ট, এবং উচ্চ কনভার্সন রেট বজায় রেখে GDPR সন্তুষ্ট করার জন্য HTML/CSS এবং ফর্মের গঠন কীভাবে রিফ্যাক্টর করা উচিত?

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

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

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

রিফ্যাক্টরিং স্ট্র্যাটেজি:

  1. সম্মতি আলাদা করা (Decouple Consent): চেকবক্সটিকে দুটি আলাদা চেকবক্সে বিভক্ত করুন। চেকবক্স A বাধ্যতামূলক এবং এটি Terms of Service ও Privacy Policy কভার করে। চেকবক্স B ঐচ্ছিক এবং এটি মার্কেটিং নিউজলেটার অপ্ট-ইন কভার করে।
  2. আনচেকড সেট করা: HTML-এ ডিফল্টরূপে উভয় চেকবক্স আনচেকড থাকা নিশ্চিত করুন (checked অ্যাট্রিবিউট বাদ দিয়ে)।
  3. CSS দৃশ্যমানতা: যেহেতু ৯০%-এর বেশি ব্যবহারকারী মোবাইলে থাকেন, তাই চেকবক্সগুলোকে সরাসরি 'Connect' বোতামের উপরে রাখুন যাতে স্ক্রল না করেই সেগুলো 'above the fold' দৃশ্যমান হয়। পড়ার সুবিধার জন্য একটি সিস্টেম ফন্ট স্ট্যাক ব্যবহার করুন এবং লেবেলের ফন্ট সাইজ 14px ও লাইন-হাইট 1.4 সেট করুন।
  4. শর্তাবলীর স্ক্রলবক্স: আইনি লেখার কারণে ফর্মের উপাদানগুলো যাতে স্ক্রিনের বাইরে চলে না যায়, সেজন্য বিস্তারিত Terms of Service-কে একটি নির্দিষ্ট উচ্চতার স্ক্রলযোগ্য কন্টেইনারে রাখুন (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 নেটওয়ার্ক কনফিগারেশনের সাথে স্থাপন করার সময় পেজটি স্টাইলহীন Times New Roman টেক্সট, ভাঙা অ্যালাইনমেন্ট এবং অনুপস্থিত আইকন সহ রেন্ডার হয়। কেন এমন ঘটে এবং অ্যাসেটগুলো কীভাবে রিফ্যাক্টর করতে হবে?

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

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

এই ব্যর্থতার কারণ হলো স্প্ল্যাশ পেজটি লোড হওয়ার সময় ডিভাইসটি একটি আন-অথেন্টিকেটেড, captive অবস্থায় থাকে। এই অবস্থায়, ওয়্যারলেস গেটওয়ে সমস্ত আউটবাউন্ড ইন্টারনেট ট্রাফিক ব্লক করে দেয় এবং শুধুমাত্র গেটওয়ের Walled Garden-এ স্পষ্টভাবে হোয়াইটলিস্ট করা ডোমেনগুলোতে রিকোয়েস্টের অনুমতি দেয়। যেহেতু 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 হিসেবে এম্বেড করুন। এটি গ্যারান্টি দেয় যে পেজটি ১০০% স্বয়ংসম্পূর্ণ এবং কোনো ইন্টারনেট কানেক্টিভিটি না থাকলেও নিখুঁতভাবে রেন্ডার হয়।

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

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

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

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

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

এই নির্দেশিকাটি ব্যাখ্যা করে যে কীভাবে IT ম্যানেজার, নেটওয়ার্ক আর্কিটেক্ট এবং ভেন্যু অপারেশন ডিরেক্টররা WiFi লগইনের সময় পেশাদার ডেটা - কোম্পানির নাম, চাকরির পদবি এবং ব্যবসায়িক ইমেল ঠিকানা - সংগ্রহ করতে B2B captive portals কনফিগার করতে পারেন। এটি VLAN আইসোলেশন এবং RADIUS অথেনটিকেশন থেকে শুরু করে Salesforce এবং HubSpot-এর সাথে CRM ইন্টিগ্রেশন পর্যন্ত সম্পূর্ণ প্রযুক্তিগত আর্কিটেকচার কভার করে, যার মধ্যে GDPR এবং CCPA কমপ্লায়েন্স বিল্ট-ইন রয়েছে। যে ভেন্যুগুলো এটি সঠিকভাবে স্থাপন করে তারা তাদের গেস্ট WiFi নেটওয়ার্ককে একটি ফার্স্ট-পার্টি ডেটা ইঞ্জিন এবং স্বয়ংক্রিয় লিড জেনারেশন সিস্টেমে রূপান্তরিত করে।

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

Starlink-এ কীভাবে একটি Captive Portal সেট আপ করবেন: দূরবর্তী এবং সামুদ্রিক ভেন্যুগুলোর জন্য একটি নির্দেশিকা

এই নির্দেশিকাটিতে কীভাবে নেটিভ Starlink হার্ডওয়্যার বাইপাস করতে হয় এবং এন্টারপ্রাইজ রাউটিং সরঞ্জাম ব্যবহার করে একটি ক্লাউড-পরিচালিত captive portal সংহত করতে হয় তা বিস্তারিতভাবে আলোচনা করা হয়েছে। আপনি কীভাবে CGNAT সীমাবদ্ধতা কাটিয়ে উঠবেন, VLAN সেগমেন্টেশন প্রয়োগ করবেন, স্যাটেলাইট ব্যান্ডউইথ সীমাবদ্ধতা পরিচালনা করবেন এবং নিয়ন্ত্রক সম্মতি নিশ্চিত করবেন তা শিখবেন।

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