这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻

前言

今天本来是和群友在群里吹水的,因为群内某位群友输出了一堆奇奇怪怪的“域名”,然后我就突然想到域名还有个 love 后缀啊!(我这两天本来也在炒米)然后就产生了一个有趣的想法。

图片[1]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

(涉及到某位群友的外号了,估计他也不想我把他人放出来,所以就没有头像和昵称,自己猜,这段对话组成共有三人)

诶,你说 love 域名,本身 xxx.love 就有种谁的爱人,谁的挚生所爱的那种感觉,前几天我本人也一直在研究 curl ,因为在服务器配置的时候经常使用到。

curl 指令可以将 url 直接请求获取并进行输出,那么如果我将 curl 指令和 love 域名结合在一起,难道不是一个很天才的结合?

于是,出现了下面这场对话:

图片[2]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

诺,这浪漫的感觉不久挠一下上来了?于是,便出现了本文。

正文

那么,以上的理论已经成立,接下来我们该如何操作呢?

原理剖析

在这一篇文章中,我们需要明白三个概念,“域名”“ HTTP 请求”和“Curl”

首先是域名:

请你想象一下,假如互联网是一个超级巨大的城市,里面住着无数个网站(也就是“房子”)。

如果要找这些房子,最原始的方法是看它们的“经纬度坐标”。

在网络世界里,每个网站都有一个唯一的数字编号,叫做 IP地址,比如:142.250.190.46

  • 电脑: 记这种数字非常快。
  • 人类: 记这种数字简直是噩梦。

所以,为了方便大家记忆,我们给这些冷冰冰的数字起了一个好听的名字,这就是 域名 (Domain Name)

所以,你可以直接理解为,域名就像一个店家的招牌,你不用完全记住这个店家的地址和所有特征,只要你能将它的招牌与他的对应实体形成连接,从而你只用记这个招牌就行,当别人跟你说这个招牌的时候你也知道别人在说什么。

其次是HTTP请求:

我们前面说了域名是一个店家的招牌,那么 HTTP 请求就是你进店之后和店员进行的**“点单交流”** 。

在互联网世界里,你的浏览器(手机、电脑)是顾客,网站的服务器是厨师HTTP(超文本传输协议)就是他们之间交流的通用语言(就像大家都说普通话,沟通才没障碍)。

当你输入网址并按下回车,其实就是给厨师发了一份**“点菜单”**。同时这也就是 GET 请求,因为你向服务器发送了一个请求的申请(好比你向厨师点了一道菜),接下来服务器需要完成你的请求并将你请求的网站传回来给你(好比厨师做好了菜需要把菜送到你的桌子上给你),而这就是一次完整的 HTTP 请求。

那么 CURL 指令呢?

你日常在用来访问网站的东西叫做浏览器,他好比一个店内的订餐平板,你可以进行即时与丰富的操作。

而 CURL 指令就像这个饭店并没有这么豪华的订餐平板,比如街头的隆江猪脚饭,你大部分时候跟老板喊一声你想吃什么就行了。而这句话便是你想老板发送的“ CURL 指令”,你让老板知道了你需要“ GET 什么”

而这就是最直观的区别,在 CURL 指令下,并没有像浏览器图形化一般丰富的界面,而就是一条指令,返回的便是你需要的网站的直接内容。

而到此,我相信你已经理解了这三个概念,那么接下来继续我们的正文。

效果剖析

在这个时候,当你输入curl xxx.love的时候,你其实就是向xxx.love发出了一次GET的请求,而他返回的XXX就是他所承载的实际内容,于是就产生了如下效果:

图片[3]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

这个时候可能会有好学的童鞋要问了,那你这个也不是直接curl域名啊,你还加了什么https呢。

如果你并不是一位计算机特长或专业或有兴趣去探讨和研究的人,那么你知道这么多已经足矣,你并不需要去理会那些玩意。

如果你想做一个这样的网站,并且你有一定的计算机基础,请看这里: 千万不要开强制 HTTPS 访问,不然你的实现效果会大打折扣,因为 http 跳 https 的原理本身就是一个301/302重定向实现的,如果你开了这两个玩意你的域名会强制跳往 HTTPS ,这个时候在直接输入curl 域名的时候就只有一个301/302请求的输出,不会输出你网站的内容,也就达不到最佳效果了!总之,网站一定要可以用 HTTP 直接访问。

图片[4]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

所以,综上所述,你需要做的就是把网站的index.html放入你心爱之人的名字等等等等你想让大家看到的内容即可。

标准实现

你只需要创建好网站,并在网站的index.html中放入你想输出的内容即可(记得内容完毕后面要加一行换行符,否则在部分终端输出效果不佳):

图片[5]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

但是通常,有的时候你用浏览器打开你的网站,你会出奇的发现出来的是一段乱码,并不是你想要的内容:

图片[6]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

这是因为,你的浏览器默认的编码并不是 UTF-8 ,从而导致浏览器用错误的编码读取了你的网站内容。

以下分享两种解决方案:

  1. 改变文件的保存编码(带 BOM 的 UTF-8)

这是最简单、最直接的方法。通常浏览器在没有收到编码指令时,会尝试自动检测。

  • 操作方法:使用代码编辑器(如 VS Code, Notepad++, Sublime Text)将文件重新保存为 “UTF-8 with BOM”
  • 原理:BOM(Byte Order Mark)是文件开头几个不可见的字节。浏览器读取到这几个字节时,会立刻明白:“哦,这个文件是 UTF-8 编码的”,从而正确渲染中文。
  • 注意:在 VS Code 中,点击右下角的编码格式(通常显示 UTF-8),选择 “Save with Encoding”,然后选择 “UTF-8 with BOM”。
  1. 通过服务器发送 HTTP 响应头

如果你有权限接触服务器(如 Nginx, Apache)或后端代码,这是最专业的方法。浏览器会优先听从服务器发出的指令,而不是 HTML 里的标签。

  • Nginx 配置: 在 serverlocation 段落中添加: add_header Content-Type "text/html; charset=utf-8";
  • Apache 配置 (.htaccess): 在根目录的 .htaccess 文件中添加: AddDefaultCharset UTF-8

这样,浏览器访问就可以恢复正常。

进阶实现

使用 chafa 将你的东西以字符的方式直观地表现出来!

图片[7]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

上面是最简单的实践,如果你需要达到这样的效果,你首先应该要阅读chafa的官网与文档⬇️

https://hpjansson.org/chafa/ (安装方法请通过官网自行摸索)

在你安装完 chafa 后,在终端输入chafa xxx.png即可实现在终端输出由图片转换出来的像素画,上面的效果是我用 Word 输入了文字,截图后喂给了chafa,在终端直接全部复制之后粘贴到 index.html 的效果。

当然,如果仅用文字,怎能实现表达一些哥们那说不尽表达不彻底的爱意呢?

那么,我们将摸索更加 NB 的实践。

进进阶实现

当你完成了进阶实现后,你会发现,既然他可以将任何的图片转换成像素画,为何我不转换更丰富更有观感与有颜色的内容呢?

善于动手的你可能已经发现了从终端复制出来的东西只是最基本的符号,其他啥丰富的样式都没有,就干巴巴的主干内容。

因为 chafa 的输出包含大量的 ANSI 转义序列(控制颜色的代码),普通的终端复制有时并不能满足所有需求。

所以,你可以使用以下命令:

chafa image.jpg > output.txt

这样你就可以完美保存 chafa 的所有输出,并且通过 cat output.txt 就可以看到 chafa 完整的输出。

注意: 用普通的记事本打开这个文件会看到一堆乱码(^[[38;2;...),因为它包含了颜色控制符。

图片[8]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

有些细心的人可能会发现,诶,那这样只有终端可以看到这样的效果,我是否可以将它转换 HTML 在浏览器上显示呢?当然可以!

(当然,我自己并不采用这个方案,因为既然都上浏览器了,为啥不直接看原图或者弄更丰富的内容?) 你可以使用 aha (Ansi HTML Adapter) 这个工具:(安装方法请自行寻求官方文档或AI)

chafa image.jpg | aha > output.html

这样你就会得到一个带有背景色和文字颜色的 HTML 文件,在浏览器里打开效果极佳。

注意:以上两种保存方法均会让chafa无法检测到终端大小,从而以图片原大小输出,你可以通过使用 -s 参数来解决这个问题(这里设置的是宽度,高度 chafa 会自行等比例缩放)

chafa -s 100 image.jpg > output.txt

诶,到这里,你既有了终端可以完美展示的版本,又有了浏览器也能查看的版本,那么有人可能既要问了:“🍊子,那我可不可以做到让 curl 获取 curl 应该获取到的版本,浏览器获取到浏览器该获取到版本呢?”

当然可以!这里我用 Gemini 老师给我用PHP实现了这个需求,参考代码如下:

(浏览器展示的是HTML字符画的版本)

<?php

// 1. 获取 User-Agent,如果没有则默认为空字符串
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';

// 2. 定义命令行工具的特征关键词 (正则匹配)
// 'i' 表示不区分大小写
$isCli = preg_match('/(curl|wget|libcurl|httpie|python-requests)/i', $userAgent);

// 3. 根据访问类型输出不同内容
if ($isCli) {
    // === 场景 A: 终端访问 (如 curl) ===
    
    // 发送纯文本头,防止终端尝试解析 HTML (虽然 curl 默认不解析,但这是好习惯)
    header('Content-Type: text/plain; charset=utf-8');
    
    // 这里读取你 chafa 生成的 ANSI/ASCII 原始文件
    // 假设文件名为 art_ansi.txt
    if (file_exists('art_ansi.txt')) {
        echo file_get_contents('art_ansi.txt');
    } else {
        echo "Error: ANSI art file not found.";
    }

} else {
    // === 场景 B: 浏览器访问 ===
    
    // 发送 HTML 头
    header('Content-Type: text/html; charset=utf-8');
    
    // 这里读取你 chafa 生成的 HTML 文件 (或者你自己包裹的 HTML)
    // 假设文件名为 art_web.html
    if (file_exists('art_web.html')) {
        echo file_get_contents('art_web.html');
    } else {
        // 如果你只有文本内容,想在浏览器显示,必须加 <pre> 标签和等宽字体
        $content = file_exists('art_ansi.txt') ? file_get_contents('art_ansi.txt') : 'Art missing';
        
        // 简单的浏览器兜底展示
        echo '<!DOCTYPE html>
        <html>
        <head>
            <style>
                body { background: #000; color: #ccc; display: flex; justify-content: center; }
                /* 关键:必须使用等宽字体,否则字符画会错位 */
                pre { font-family: "Courier New", Courier, monospace; line-height: 1; font-size: 12px; }
            </style>
        </head>
        <body>
            <pre>' . htmlspecialchars($content) . '</pre>
        </body>
        </html>';
    }
}
?>

(浏览器展示的是原图的版本)

<?php

// 1. 获取 User-Agent
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';

// 2. 判断是否为命令行工具
$isCli = preg_match('/(curl|wget|libcurl|httpie|python-requests)/i', $userAgent);

// === 配置你的文件路径 ===
// 这是 Chafa 生成的文本文件(给 curl 看)
$ansiArtFile = 'art_output.txt'; 
// 这是你想在浏览器展示的图片(可以是原图 .jpg/.png,也可以是 chafa 生成的 .svg)
$imageFile = 'original_image.png'; 

if ($isCli) {
    // ===========================
    // 场景 A: 终端访问 (输出字符画)
    // ===========================
    header('Content-Type: text/plain; charset=utf-8');
    
    if (file_exists($ansiArtFile)) {
        // 直接输出字符画内容
        readfile($ansiArtFile);
    } else {
        echo "Error: ASCII art file is missing.";
    }

} else {
    // ===========================
    // 场景 B: 浏览器访问 (输出图片)
    // ===========================
    
    if (file_exists($imageFile)) {
        // 1. 自动检测图片的 MIME 类型 (如 image/png, image/jpeg, image/svg+xml)
        $mimeType = mime_content_type($imageFile);
        
        // 2. 设置正确的头信息,告诉浏览器这是一张图片
        header('Content-Type: ' . $mimeType);
        
        // 3. 设置内容长度 (好习惯,有助于浏览器显示加载进度)
        header('Content-Length: ' . filesize($imageFile));
        
        // 4. 清空缓冲区 (防止之前的 echo 或空格污染图片数据)
        if (ob_get_length()) ob_clean();
        flush();
        
        // 5. 输出图片二进制数据
        readfile($imageFile);
    } else {
        // 图片不存在时的兜底
        header('Content-Type: text/plain');
        echo "Error: Image file not found.";
    }
}

exit; // 确保脚本结束,后面不要有任何多余输出
?>

这样,你就可以完美实现做到终端和浏览器显示相同的内容,并匹配最佳的内容进行展示:

图片[9]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

那么,相信有些人会觉得一条一条指令分别生成终端和浏览器的文件会很麻烦,所以这里我也让Gemini老师写了一个 sh 脚本,供大家参考。

用法: sh xxx.sh xxx.png 图片宽度(图片宽度默认100,高度自动等比例缩放)

#!/bin/bash

# 1. 检查参数
if [ -z "$1" ]; then
    echo "使用方法: $0 <图片路径> [宽度(可选,默认为100)]"
    echo "示例: $0 image.jpg 80"
    exit 1
fi

IMAGE_PATH="$1"
# 2. 设置宽度
# 如果提供了第2个参数,就用第2个参数;否则默认使用 100
# 100 字符宽通常是一个在笔记本和显示器上都比较安全的尺寸
WIDTH="${2:-100}"

# 3. 检查依赖
if ! command -v chafa &> /dev/null; then
    echo "错误: 未找到 'chafa' 命令。"
    exit 1
fi

if ! command -v aha &> /dev/null; then
    echo "错误: 未找到 'aha' 命令。"
    exit 1
fi

# 4. 检查文件
if [ ! -f "$IMAGE_PATH" ]; then
    echo "错误: 文件 '$IMAGE_PATH' 不存在。"
    exit 1
fi

FILENAME=$(basename -- "$IMAGE_PATH")
NAME_NO_EXT="${FILENAME%.*}"

echo "正在处理: $FILENAME (目标宽度: ${WIDTH} 字符)..."

# 5. 生成终端文本 (.txt)
# -s ${WIDTH} 告诉 chafa 强制设定宽度,高度会自动按比例缩放
chafa -s "$WIDTH" "$IMAGE_PATH" > "${NAME_NO_EXT}.txt"
echo "✅ [1/2] 终端文本已生成: ${NAME_NO_EXT}.txt"

# 6. 生成网页文件 (.html)
# 网页版通常可以稍微大一点,或者保持一致。这里保持一致以确保不溢出。
chafa -c full -s "$WIDTH" "$IMAGE_PATH" | aha --black > "${NAME_NO_EXT}.html"
echo "✅ [2/2] 网页文件已生成: ${NAME_NO_EXT}.html"

echo "---"
echo "完成!如果觉得太小或太大,请调整第二个参数再次运行。"

尾声

其实以上只是一些对于业内人士来讲十分基础,十分小白的实现,各位也可以以这个为思路,来创造更多的可能与效果!让大家看看,干互联网这行的,不是没有感情的(笑)

那么到这里,本篇文章也应该告一段落喽~至于上面的演示域名,我会一直保留(而且还可能会更新)大家也可以自行尝试一下。

哎~有时候可能表达一些心意,虽然内容简陋,但是以不一样的方式传达出去,效果也会不一样吧。

那么就这样吧,再会,各位。

彩蛋

图片[10]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆
图片[11]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆

理论上还可以通过修改 HTTP 状态码,实现一个更不一样的效果,但是本人并没有进行实践,有兴趣的朋友可以尝试一下然后回报结果!

补充一下 xioiox 的方案:

图片[12]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆
图片[13]-这可能就是网维的浪漫:一个域名和一个请求组成的浪漫时刻-皆成所忆
© 版权声明
THE END
喜欢就支持一下作者吧
点赞8 分享
评论 共1条

请登录后发表评论

    请登录后查看评论内容