你需要一个网页环
You need a webring

原始链接: https://shub.club/writings/2026/july/you-need-a-webring/

如果您拥有一个个人网站,并且至少有一位朋友,作者建议您建立一个“网络环”(webring)。“网络环”本质上是一个由拥有共同爱好或兴趣的网站组成的环形链接网络,旨在促进社区交流与发现。 您可以手动设置,让每位参与者链接到环中的下一个站点。对于更高级的自动化方法,作者建议使用网络服务器将成员的网址存储在 JSON 文件中。通过路由设置 `/next`(下一个)、`/prev`(上一个)和 `/random`(随机)端点,您可以让用户在各个站点间顺畅地浏览。 作者通过免费的 Cloudflare Worker 成功实现了这一功能,并指出这种设置既易于管理,又是一种与在线他人建立联系的有趣方式。

关于“网页环”(webrings)的 Hacker News 讨论捕捉到了一场怀旧的辩论,即早期互联网去中心化、“人性化”的本质,与现代搜索和社交媒体的实用性之间的博弈。 网页环起源于 20 世纪 90 年代,是一系列以环形或列表形式相互链接的网站,允许用户在相关的独立站点之间导航。批评者认为,这种结构在功能上已经过时且脆弱,远不如现代基于搜索的发现方式或简单的精选链接列表。 然而,支持者将网页环视为对现代网络“量化和功利化”的一种抗议。他们认为,网页环促进了真实的社区交流,优先考虑偶然性,并通过允许创作者在没有算法干预或商业动机的情况下相互链接,保持了网络的“人性”。虽然有些人认为这纯粹是怀旧,但另一些人则认为,它是对抗现代“社交媒体垃圾信息”的必要解毒剂。归根结底,人们达成了一种共识:尽管网页环在技术设计上并非最优,但作为一种从企业掌控的平台手中夺回开放、互联网络的创意实践,它们依然具有深远的意义。
相关文章

原文

Posted on • 0 views

You need a webring!

Yes, you!

If you have (1) a personal website and (2) n+0 friends, you should set up a webring.

What is a webring? Well its just a circular linked list of websites that have some topic assiged to it. It could be a hobby, a passion, or just your friends!

The lore behind webrings is pretty deep, I would read more about it here linky. But to be honest, all you need to know is it's just fun.

How does one set up a webring?

The easy but tedious way:

Just manually tell your group to link each other your websites so it loops.

Site A would link to Site B, B to C and C back to A.

The more complexish way

Set up a web server that stores a json file of all your friends websites, then just have a /prev and /next route that will auto navigate.

import ring from './ring.json';

const {members} = ring;

export default {
  
  async fetch(request, env, ctx): Promise<Response> {
    const pathname = new URL(request.url).pathname;
    

    const referrer = new URL(request.url).searchParams.get('from') || request.headers.get('referer') || request.headers.get('referrer') || '';
    const currentMember = members.find(member => member.url === referrer);

    if (!currentMember) {
      return new Response('Member not found', {status: 404});
    }

    switch (pathname) {
      case '/':
        return new Response('Zadu');
      case '/next':
        const nextMember = members[(members.indexOf(currentMember) + 1) % members.length];

        
        return Response.redirect(nextMember.url, 302);
      case '/prev':
        const prevMember = members[(members.indexOf(currentMember) - 1 + members.length) % members.length];

        
        return Response.redirect(prevMember.url, 302);
      case '/random':
        const randomMember = members[Math.floor(Math.random() * members.length)];

        
        return Response.redirect(randomMember.url, 302);
      default:
        
        return new Response('Not Found', {status: 404});
    }
  },
} satisfies ExportedHandler<Env>;

I personally used a cloudflare worker for this, since that is free and I don't expect heavy usage from it. You can see the full soure code here.

联系我们 contact @ memedata.com