# ============================================================ # ⚡ বাজার সদাই (bazarsodaie.com) — সম্পূর্ণ .htaccess # পারফরম্যান্স + সোশ্যাল শেয়ার + Pretty URL + নিরাপত্তা + পুরনো লিংক রিডাইরেক্ট # ============================================================ # ব্যবহার: এই ফাইলের পুরো লেখাটা কপি করে সাইটের রুট ফোল্ডারের `.htaccess` # ফাইলে পেস্ট করুন। (cPanel → File Manager → Settings → "Show Hidden Files") # # ⚠️ পেস্ট করার আগে বর্তমান .htaccess-এর একটা কপি রেখে দিন। # ⚠️ ফাইল না থাকলে নতুন বানান — নাম হুবহু `.htaccess` (শুরুতে ডট আছে) # # 💡 500 Error এলে: আপনার হোস্টিংয়ে ওই মডিউলটা নেই — সেই অংশটুকু মুছে দিন। # প্রতিটি অংশ দিয়ে ঘেরা, তাই সাধারণত সমস্যা হয় না। # ============================================================ # ============================================================ # ০. রুট ডোমেইন হোম পেজ — কোন ফাইল ডিফল্টে চলবে # ============================================================ # আপনার মূল ফাইল bzr.php (index.php নয়)। তাই ডোমেইনে (bazarsodaie.com) # সরাসরি ঢুকলে সার্ভার যেন bzr.php চালায় — নাহলে LiteSpeed "403 Forbidden" দেয়। DirectoryIndex bzr.php index.php index.html # ডিরেক্টরি লিস্টিং বন্ধ (ফাইলের তালিকা কেউ দেখতে পারবে না) Options -Indexes # ============================================================ # ১. সোশ্যাল ক্রলার অ্যালাউ — লিংক শেয়ারে "403 Forbidden" ঠিক করে # ============================================================ # এটা সবার উপরে থাকতে হবে। এখানে সব বড় প্ল্যাটফর্মের প্রিভিউ-বট allow করা: # Facebook, Messenger, WhatsApp, Telegram, Twitter/X, LinkedIn, Slack, # Discord, Skype, Pinterest, এবং Email প্রিভিউ (Outlook/Gmail/Yahoo)। # ----- Facebook ও Messenger (একই বট শেয়ার করে) ----- SetEnvIfNoCase User-Agent "facebookexternalhit" allow_social SetEnvIfNoCase User-Agent "Facebot" allow_social SetEnvIfNoCase User-Agent "facebookcatalog" allow_social # ----- WhatsApp ----- SetEnvIfNoCase User-Agent "WhatsApp" allow_social # ----- Telegram ----- SetEnvIfNoCase User-Agent "TelegramBot" allow_social # ----- Twitter / X ----- SetEnvIfNoCase User-Agent "Twitterbot" allow_social # ----- অন্যান্য মেসেজিং / সোশ্যাল ----- SetEnvIfNoCase User-Agent "LinkedInBot" allow_social SetEnvIfNoCase User-Agent "Slackbot" allow_social SetEnvIfNoCase User-Agent "Discordbot" allow_social SetEnvIfNoCase User-Agent "SkypeUriPreview" allow_social SetEnvIfNoCase User-Agent "Pinterest" allow_social SetEnvIfNoCase User-Agent "vkShare" allow_social # ----- Email প্রিভিউ (Outlook / Gmail / Yahoo লিংক প্রিভিউ দেখায়) ----- SetEnvIfNoCase User-Agent "Google" allow_social SetEnvIfNoCase User-Agent "Outlook" allow_social SetEnvIfNoCase User-Agent "YahooMailProxy" allow_social # ----- Apple (iMessage/Mail লিংক প্রিভিউ) ----- SetEnvIfNoCase User-Agent "Applebot" allow_social Require env allow_social Require all granted # ============================================================ # ২. PRETTY URL — /raincoat দেখাবে, ভেতরে bzr.php?pretty=raincoat চলবে # ============================================================ # এতে লিংক পেশাদার দেখায়। পুরনো ?action=view&slug=... লিংকও কাজ করতে থাকে। RewriteEngine On # আসল ফাইল বা ফোল্ডার হলে হাত দিও না (ছবি, css, bzr.php নিজে, assets/ ইত্যাদি) RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # ---- পুরনো "/step/..." ফোল্ডারের লিংক (আগে স্ক্রিপ্ট ওই ফোল্ডারে ছিল, # এখন নেই — তাই সার্ভার সরাসরি ৪০৪ দিয়ে দিত, PHP পর্যন্ত পৌঁছাতই না) — # এখন সেটাকে ভেতরে ভেতরে বর্তমান রুট ফোল্ডারের bzr.php-তে পাঠিয়ে দিই, # query string (fbclid, utm_ ইত্যাদি ট্র্যাকিং প্যারামিটার) অক্ষত রেখে। # এরপর bzr.php-এর ভেতরের "রিডাইরেক্ট ম্যানেজার" ড্যাশবোর্ড থেকেই পুরনো # স্লাগকে নতুন/বিদ্যমান লিংকে ৩০১ পাঠানো ম্যানেজ করা যাবে — .htaccess-এ # আর হাত দেওয়া লাগবে না, ভবিষ্যতের যেকোনো পুরনো /step/ লিংকও এটাই ধরবে। RewriteRule ^step/(.*)$ $1 [L,QSA] # 🔑 প্রোডাক্ট ইউনিক কোড — যেমন /products/BXP07NX20 — bzr.php নিজেই কোড দিয়ে # প্রোডাক্ট খুঁজে তার আসল (canonical) স্লাগ-URL এ 301 রিডাইরেক্ট করে দেয়। RewriteRule ^products/([A-Za-z0-9]{9})/?$ bzr.php?product_code=$1 [L,QSA] # 🗺️ sitemap.xml ও robots.txt — bzr.php-এর ভেতরে ডাইনামিক জেনারেটরে পাঠাই, # যাতে ডোমেইন-নাম ও প্রোডাক্ট/পেজ তালিকা সবসময় হালনাগাদ থাকে (আলাদা স্ট্যাটিক # ফাইল রাখতে হয় না, নতুন প্রোডাক্ট/পেজ যোগ করলেই sitemap নিজে থেকে আপডেট হয়)। RewriteRule ^sitemap\.xml$ bzr.php?action=sitemap [L,QSA] # 🛍️ প্রোডাক্ট ক্যাটালগ ফিড (Facebook/Google/TikTok Catalog) RewriteRule ^product-feed\.xml$ bzr.php?action=product_feed [L,QSA] RewriteRule ^robots\.txt$ bzr.php?action=robots [L,QSA] # ⚠️ গুরুত্বপূর্ণ: /raincoat পেজ থেকে অর্ডার সাবমিট হয় relative fetch দিয়ে, # যা হয়ে যায় /raincoat?action=submit_order। এই ক্ষেত্রে pretty=raincoat আর # action=submit_order দুইটা একসাথে গেলে গোলমাল হতে পারে — তাই query-তে # আগে থেকেই action= থাকলে সরাসরি bzr.php তে পাঠাই, pretty যোগ করি না। RewriteCond %{QUERY_STRING} (^|&)action= [NC] RewriteRule ^([^/.]+)/?$ bzr.php [L,QSA] # সাধারণ pretty লিংক (/raincoat, /shop) — query-তে action নেই। # একটি শব্দ (স্লাগ) ধরে bzr.php?pretty= এ পাঠাই। # ভেতরে PHP ঠিক করে নেয় এটা shop নাকি পেজ। # ([^/.]+) = স্পেস/+/%20/বাংলা থাকা স্লাগও চলে (যেমন /Healthy+Plus); ডট থাকলে (ফাইল) এই রুলে ঢোকে না। RewriteRule ^([^/.]+)/?$ bzr.php?pretty=$1 [L,QSA] # ============================================================ # ৩. GZIP কম্প্রেশন (ফাইল ৭০-৮০% ছোট হয়) # ============================================================ AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/javascript application/x-javascript AddOutputFilterByType DEFLATE application/json application/xml AddOutputFilterByType DEFLATE image/svg+xml # ============================================================ # ৪. ব্রাউজার ক্যাশিং # ============================================================ ExpiresActive On # ছবি — ১ বছর ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/webp "access plus 1 year" ExpiresByType image/svg+xml "access plus 1 year" ExpiresByType image/x-icon "access plus 1 year" # ফন্ট — ১ বছর ExpiresByType font/woff2 "access plus 1 year" ExpiresByType font/woff "access plus 1 year" ExpiresByType application/font-woff "access plus 1 year" # CSS / JS — ১ মাস ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" # HTML — ক্যাশ নয় (সবসময় নতুন অর্ডার দেখাতে হবে) ExpiresByType text/html "access plus 0 seconds" # ছবি ও ফন্টে দীর্ঘ ক্যাশ Header set Cache-Control "public, max-age=31536000, immutable" # assets ফোল্ডারের CSS/JS — ১ বছর ক্যাশ # (tailwind.min.css এখানেই থাকে। আপডেট করলে PHP-তে ?v=1 → ?v=2 করে দিন) Header set Cache-Control "public, max-age=31536000, immutable" # PHP পেজে ক্যাশ বন্ধ (সবসময় সর্বশেষ ডেটা) Header set Cache-Control "no-cache, must-revalidate" # নিরাপত্তা হেডার Header set X-Content-Type-Options "nosniff" Header set X-Frame-Options "SAMEORIGIN" # ============================================================ # ৫. ETag বন্ধ (ক্যাশিং আরও নির্ভরযোগ্য হয়) # ============================================================ Header unset ETag FileETag None # ============================================================ # ৬. সংবেদনশীল ফাইল সুরক্ষা # ============================================================ # ডাটাবেজ ব্যাকআপ, লগ, .env — কেউ ডাউনলোড করতে পারবে না Require all denied # 🔒 config.php — এখানে ডাটাবেজ পাসওয়ার্ড থাকে। এটা .php ফাইল হওয়ায় সাধারণত # ব্রাউজারে খুললে PHP এক্সিকিউট হয়ে যায় (raw কোড দেখা যায় না, শুধু খালি পেজ # দেখাবে) — কিন্তু সার্ভার ভুলবশত PHP এক্সিকিউট বন্ধ করে দিলে raw পাসওয়ার্ড # ফাঁস হয়ে যেতে পারে। তাই আলাদা করে সরাসরি ব্লক করা হলো (শুধু এই একটা # নির্দিষ্ট ফাইলের নাম — অন্য কোনো .php ফাইল এতে প্রভাবিত হয় না)। Require all denied # আপলোড ফোল্ডারে PHP চালানো বন্ধ (কেউ ছবির নামে স্ক্রিপ্ট আপলোড করলেও চলবে না)। # ⚠️ এখানে দিয়ে সরাসরি ব্লক করা হয়নি — কারণ রুট .htaccess-এ তেমন নিয়ম # পুরো সাইটকেই (bzr.php নিজেও .php দিয়ে শেষ, তাই সেটাও ব্লক হয়ে যেত) বন্ধ করে দিত। # তাই শুধু uploads/ পাথ-স্কোপড RewriteRule ব্যবহার করা হলো। বাড়তি নিরাপত্তার জন্য # uploads-htaccess.txt নামে একটা আলাদা ফাইল দেওয়া হয়েছে — সেটা uploads/.htaccess # হিসেবে uploads ফোল্ডারের ভেতরে (রুটে নয়) আপলোড করলে দ্বিতীয় স্তরের সুরক্ষা যোগ হবে। RewriteEngine On RewriteRule ^uploads/.*\.(php|phtml|pht|phar|php[3-8])$ - [F,L] # ============================================================ # 📌 কাজ করছে কিনা যাচাই # ============================================================ # ১. Facebook Sharing Debugger-এ লিংক দিয়ে "Scrape Again" চাপুন: # https://developers.facebook.com/tools/debug/ # → Response Code 200 আর আসল টাইটেল এলে ঠিক আছে। # ২. যদি এখনও 403 আসে → সমস্যা হোস্টিং সার্ভারে (LiteSpeed/mod_security), # .htaccess-এ নয়। তখন Hostever-কে facebookexternalhit whitelist করতে বলুন। # ৩. স্পিড যাচাই: সাইট খুলুন → F12 → Network → tailwind.min.css এর Headers-এ # "content-encoding: gzip" ও "cache-control: max-age=31536000" আছে কিনা দেখুন। # ৪. পুরনো /step/ লিংক টেস্ট: /step/bzr.php?action=view&slug=raincoat খুলুন # → এখন এটা ৪০৪ না দিয়ে bzr.php-এর "রিডাইরেক্ট ম্যানেজার" ড্যাশবোর্ডে # সেট করা রুল অনুযায়ী আচরণ করবে (রুল থাকলে ৩০১ রিডাইরেক্ট, নাহলে # ব্র্যান্ডেড ৪০৪ পেজ — আর সেই পাথটা "শনাক্ত হওয়া ভাঙা লিংক" লিস্টে জমা হবে)। # ============================================================ # php -- BEGIN cPanel-generated handler, do not edit # Set the “ea-php84” package as the default “PHP” programming language. AddHandler application/x-httpd-ea-php84___lsphp .php .php8 .phtml # php -- END cPanel-generated handler, do not edit