Debian tarqatmalari uchun takrorlanadigan paketlar talabi kuchaymoqda
Debian hamjamiyati takrorlanadigan paketlar (reproducible builds)ni majburiy qilishni ko'rib chiqmoqda – bu xavfsizlik, ishonchlilik va sifatni oshiradi.

Ko‘plab veb‑sayt egalari blogni subdomain (blog.example.com) o‘rniga subdirectory (example.com/blog)da joylashtirishni afzal ko‘radi. Bu usul sahifa reytingini oshiradi, foydalanuvchi tajribasini yaxshilaydi va texnik jihatdan ham bir qancha afzalliklarga ega. Quyida Cloudflare, Vercel va Render kabi mashhur platformalar yordamida subdirectory’da blogni qanday ishga tushirishni bosqichma‑bosqich ko‘rib chiqamiz.
Google rasmiy ravishda subdomainlarni alohida sayt deb hisoblamaydi, ammo amaliy tajribalar subdirectorylar sahifalar orasidagi authority (hukm)ni birlashtiradi. Natijada:
Quyidagi xizmatlar misol sifatida keltirilgan, lekin boshqa provayderlar ham xuddi shunday ishlaydi:
Cloudflare boshqaruv paneliga kirib, SSL/TLS → Overview → Configure → Custom SSL/TLS → Full ni tanlang. So‘ng DNS bo‘limida CNAME yozuvlarini qo‘shing:
@ → my-site.onrender.com (proxied)www → my-site.onrender.com (proxied)api → my-api.onrender.com (proxied)Bu yozuvlar asosiy domeningizni Render‑da joylashgan saytga yo‘naltiradi.
Blog subdomaini (blog.example.com) allaqachon Vercel’da ishlayotgan bo‘lsa, quyidagicha CNAME qo‘shing:
blog → cname.vercel-dns.com (proxied)Next.js konfiguratsiya faylida (next.config.js) basePath parametrini qo‘shing:
/** @type {import('next').NextConfig} */
const nextConfig = {
basePath: "/blog", // Add this line
images: {
remotePatterns: [
{
protocol: "https",
hostname: "imagedelivery.net",
},
],
},
redirects: async () => {
return [];
},
};
export default nextConfig;
/** @type {import('next').NextConfig} */
const nextConfig = {
basePath: "/blog",
images: { remotePatterns: [{ protocol: "https", hostname: "imagedelivery.net" }] },
redirects: async () => []
};
export default nextConfig;
Bu kod blogni /blog yo‘nalishi ostida ishlashini ta’minlaydi.
// worker.js
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run "npm run dev" in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run "npm run deploy" to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!');
},
};
Workers & Pages bo‘limiga o‘ting, Create Worker tugmasini bosib, “Hello World” shablonini tanlang. Keyin quyidagi kodni joylashtiring:
export default {
async fetch(request, env, ctx) {
async function MethodNotAllowed(request) {
return new Response(`Method ${request.method} not allowed.`, {
status: 405,
headers: {
Allow: "GET",
},
});
}
// Only GET requests work with this proxy.
if (request.method !== "GET") return MethodNotAllowed(request);
// Get the URL that was just requested.
const url = new URL(request.url);
// Swap out the subdirectory with the subdomain to request the actual URL.
const originUrl = url.toString().replace(
'https://example.com/blog',
'https://blog.example.com/blog'
).replace(
'https://www.example.com/blog',
'https://blog.example.com/blog'
);
// Fetch the origin.
const originPage = await fetch(originUrl);
// Return the subdomain, as the subdirectory.
const newResponse = new Response(originPage.body, originPage);
return newResponse;
},
};
export default {
async fetch(request) {
if (request.method !== "GET") {
return new Response(`Method ${request.method} not allowed.`, {status: 405, headers: {Allow: "GET"}});
}
const url = new URL(request.url);
const originUrl = url.toString()
.replace('https://example.com/blog', 'https://blog.example.com/blog')
.replace('https://www.example.com/blog', 'https://blog.example.com/blog');
const originResp = await fetch(originUrl);
const resp = new Response(originResp.body, originResp);
// Subdomain uchun noindex ni olib tashlaymiz
resp.headers.delete('x-robots-tag');
return resp;
}
};
URL‑larni o‘z domeningizga moslang va “Deploy” tugmasini bosing.
Worker Routes bo‘limida ikki yo‘nalishni qo‘shing:
example.com/blog* – blog‑workerexample.com/blog/_next/static* – blog‑workerEndi blog example.com/blog manzilida ko‘rinadi.
Subdomainni indekslanmasligi uchun Next.js‑da headers funksiyasini qo‘shing:
async headers() {
return [{
source: '/:path*',
headers: [{key: 'X-Robots-Tag', value: 'noindex, nofollow'}]
}];
}
Worker kodida resp.headers.delete('x-robots-tag'); qatori bu tagni subdirectory uchun olib tashlaydi.
Google URL Inspection vositasi bilan example.com/blog sahifasining indekslanganligini tasdiqlang. Shuningdek, brauzerning “Network” panelida X-Robots-Tag sarlavhasining yo‘qligini tekshiring.
Bu qadamlarni bajarganingizdan so‘ng, blogingiz subdirectoryda to‘liq ishlaydi, SEO foydalari maksimal darajada bo‘ladi va subdomain eski manzilida indekslanmaydi.