diff --git a/AGENTS.md b/AGENTS.md index 5739a95a..3417cc13 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,16 +20,20 @@ ## CFN系绘图接手 接手首张试画及提示词:/Users/hellcat/Documents/Codex/2026-10-23/cfn/outputs/cfn-tuxedo-cat-20261023.png 和同名txt。用户已认可风格并继续扩充;2026-10-26按授权与后续猫狗作品一起归档到Resource V2,并接入本地FNA_V3,未发布到线上。归档和栏目配图的唯一维护入口见[本地插画资源与配图](docs/maintenance/ILLUSTRATIONS.md)。 -教程栏目现为“入门教程”(/client)和“综合教程”(/advanced,原进阶教程)。栏目改名、首篇重写、DNS进阶文章及内容回退见[教程栏目维护](docs/maintenance/TUTORIALS.md)。原七篇旧教程均已处理:迁移文归进阶,其余按Android、iOS、Mac和Linux重写;另有Windows纯入门与DNS进阶文章。正文、图解和关联已本地验收,本地内容不代表线上发布。 +教程栏目本地现为“新手教程”(/client,原入门教程)和“综合教程”(/advanced,原进阶教程)。栏目改名、首篇重写、DNS进阶文章及内容回退见[教程栏目维护](docs/maintenance/TUTORIALS.md)。原七篇旧教程均已处理:迁移文归进阶,其余按Android、iOS、Mac和Linux重写;另有Windows纯入门与DNS进阶文章。正文、图解和关联已本地验收,本地内容不代表线上发布。 ## FNA 静态配图副本 2026-10-30起Resource保留原稿、图池和固定分配,FNA保存按内容去重的公开展示副本,由本站Nginx直接提供。同步、创建时校验、撤回、缓存与部署验收唯一正文见[静态配图副本](docs/maintenance/LOCAL_ILLUSTRATIONS.md)。用户访问图片不调用Resource、不执行PHP修复。2026-10-31明确源端删除/停用不影响FNA独立副本或已有文章关联,修复与恢复原图记录见[独立副本保留修复](docs/maintenance/INDEPENDENT_ILLUSTRATIONS_FIX_2026-10-31.md)。 +2026-11-01本地新增八篇新手教程、置顶指引并将原七篇平台文章移入综合教程;免费节点页已接入指引。每篇新文独立设计主题封面并加网址水印。范围、回执与未上线边界见[新手教程调整](docs/maintenance/NEWCOMER_TUTORIALS_2026-11-01.md)。当前分类、文章与关系以写作索引为准,上述旧批次描述保留为历史。 + ## AI 文章写作(必读) 后续为 FNA_V3 选题、写作、重写、调整分类或撤下文章时,必须先读[AI写作与文章关联索引](docs/content/WRITING.md)。它是文章用途、稳定地址和正文关系的唯一登记入口。公开文章禁止出现“核对范围”“未实测”等内部核验/验收说明,具体禁止项与发布前检查按该写作规范执行;相关事实只留项目维护记录。写作时复用相关的下载、入门、进阶和排错内容,自然设置内链,并检查相关旧文是否需要补入口;完成后同步正文源、运行数据库和该索引,验收真实目标与锚点。未创建的文章不能编造链接,本地生效不能写成已上线;不自动开展全站重写或发布。 +教程配图必须按[写作规范](docs/content/WRITING.md#教程双比例配图正式规则2026-11-01)交付3:2列表图和约2.4:1详情横幅:分别构图、统一纸艺质感、每篇不同场景、两图加网址水印;`cover`用于列表,`show_cover=false`,正文开头使用唯一`guide-figure tutorial-hero`。后续聊天及周期写作同样适用,发布前检查桌面和手机。 + ## 独立文章发布 API 用户已明确文章直接发布到 FNA_V3,不经过 ATOM。实现、调用契约、凭据边界及验收见[独立文章 API](docs/maintenance/EDITORIAL_API.md)。后续写稿使用本站草稿→签名预览→按hash发布→回执核对流程;相关旧文内链修改可同批提交。不要再用临时SQL脚本发布普通编辑文章。旧文首次接管必须显式指定原文章ID并保留URL;发布结果未知先查原请求UUID。代码已于2026-10-29随正式切换部署,生产临时编辑密钥在教程迁移后删除、接口默认关闭;后续按明确写作/发布任务临时启用并在完成后关闭,不扩大线上访问或发布范围。正式部署、备份、Git SHA及验收统一见[发布记录](docs/maintenance/RELEASE_PREFLIGHT_2026-10-28.md#正式切换2026-10-29)。 @@ -40,6 +44,12 @@ ## 独立文章发布 API 教程SEO、编辑API的IndexNow结果与重试、栏目sitemap的唯一维护说明见[教程SEO通知](docs/maintenance/EDITORIAL_INDEXNOW.md)。`sitemap: done`不代表搜索引擎已收到通知或已收录。 +2026-11-01免费苹果ID详情页本地重设计:地区筛选、账号复制卡片、原始载荷保护、空记录与夜间模式见[苹果ID内容页维护](docs/maintenance/APPLE_ID_ARTICLE_LAYOUT.md)。仅本地,未部署;2026-11-02已补全82篇原始载荷复核,密码默认打码及显示/隐藏的维护和验收也见该文。 + +2026-11-01本地页头新增日间/夜间切换,默认跟随系统、手动选择持久化及窄屏验收见[主题切换维护](docs/maintenance/COLOR_SCHEME.md),未发布。 + +2026-11-02本地新增独立“看看资讯”栏目 `/news`,无文章、未发布;创建命令、分类备份及验收见[资讯栏目维护](docs/maintenance/NEWS.md)。 + ## SEO统一合同(2026-10-31) 首页、归档、教程、分页、索引、sitemap、内容更新时间和IndexNow统一按[SEO实施维护](docs/maintenance/SEO_IMPLEMENTATION_2026-10-31.md)。禁止恢复全query robots屏蔽、分页canonical第一页、按180天批量删正文、用点赞updated_at作为lastmod,或让源图删除影响本站独立副本。当前状态和未取得的搜索平台证据见该文档;实施不等于收录/排名已验证。 diff --git a/app/Console/Commands/OrganizeTutorials.php b/app/Console/Commands/OrganizeTutorials.php new file mode 100644 index 00000000..1d8a7879 --- /dev/null +++ b/app/Console/Commands/OrganizeTutorials.php @@ -0,0 +1,45 @@ +where('sSlug', config('tutorials.beginner_slug'))->where('iStatus', 1)->first(); + $guide = DB::table('articles')->where('sSlug', config('tutorials.guide_slug'))->where('iStatus', 1)->first(); + if (! $category || ! $guide || $guide->iCategoryId !== $category->id) { + $this->error('Publish the guide in the beginner category before applying metadata.'); + return self::FAILURE; + } + $this->line(json_encode(['category' => $category->sSlug, 'name' => config('tutorials.beginner_name'), 'guide' => $guide->sSlug, 'pinned' => true], JSON_UNESCAPED_UNICODE)); + if (! $this->option('apply')) return self::SUCCESS; + $backup = storage_path('app/private/editorial/tutorial-metadata-'.Str::uuid().'.json'); + $snapshot = ['category_id' => $category->id, 'sName' => $category->sName, 'guide_id' => $guide->id, 'iIsTop' => $guide->iIsTop]; + file_put_contents($backup, json_encode($snapshot, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + chmod($backup, 0600); + DB::transaction(function () use ($category, $guide) { + $currentCategory = DB::table('categories')->where('id', $category->id)->lockForUpdate()->first(); + $currentGuide = DB::table('articles')->where('id', $guide->id)->lockForUpdate()->first(); + if ($currentCategory->sName !== $category->sName || $currentGuide->iCategoryId !== $category->id || ! $currentGuide->iStatus) { + throw new \RuntimeException('Tutorial metadata changed; inspect before retrying.'); + } + DB::table('categories')->where('id', $category->id)->update(['sName' => config('tutorials.beginner_name')]); + DB::table('articles')->where('id', $guide->id)->update(['iIsTop' => 1]); + }); + Cache::forget('global_nav_tree'); + \Spatie\ResponseCache\Facades\ResponseCache::clear(); + $this->info('Category renamed and guide pinned. Private backup: '.$backup); + return self::SUCCESS; + } +} diff --git a/app/Console/Commands/SetupNewsCategory.php b/app/Console/Commands/SetupNewsCategory.php new file mode 100644 index 00000000..10c93c3a --- /dev/null +++ b/app/Console/Commands/SetupNewsCategory.php @@ -0,0 +1,56 @@ +where('sSlug', 'news')->orWhere('sName', '看看资讯')->get(); + if ($existing->isNotEmpty()) { + if ($existing->count() !== 1 || $existing[0]->sSlug !== 'news' + || $existing[0]->sName !== '看看资讯' || (int) $existing[0]->iParentId !== 0 || (int) $existing[0]->iStatus !== 1) { + $this->error('Conflicting news category; inspect before changing it.'); + return self::FAILURE; + } + $this->info('看看资讯 already exists at /news (id '.$existing[0]->id.').'); + return self::SUCCESS; + } + $this->line('Create 看看资讯 at /news, after existing top-level categories.'); + if (! $this->option('apply')) return self::SUCCESS; + + $directory = storage_path('app/private/category-backups'); + if (! is_dir($directory)) mkdir($directory, 0700, true); + $backup = $directory.'/news-'.Str::uuid().'.json'; + $before = DB::table('categories')->orderBy('id')->get(); + if (file_put_contents($backup, json_encode($before, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) === false) { + throw new \RuntimeException('Category backup failed.'); + } + chmod($backup, 0600); + $id = DB::transaction(function () { + $rows = DB::table('categories')->lockForUpdate()->get(); + if ($rows->contains(fn ($row) => $row->sSlug === 'news' || $row->sName === '看看资讯')) { + throw new \RuntimeException('Category state changed; rerun after inspection.'); + } + return DB::table('categories')->insertGetId([ + 'iParentId' => 0, 'sName' => '看看资讯', 'sSlug' => 'news', + 'sDescription' => '最新资讯与动态。', + 'iSort' => $rows->where('iParentId', 0)->max('iSort') + 1, + 'iStatus' => 1, 'sHtmlClass' => 'fas fa-newspaper', + 'iShowChildren' => 0, 'aBanner' => null, 'aOpt' => null, + ]); + }); + Cache::forget('global_nav_tree'); + \Spatie\ResponseCache\Facades\ResponseCache::clear(); + $this->info('Created 看看资讯 at /news (id '.$id.'). Backup: '.$backup); + return self::SUCCESS; + } +} diff --git a/app/Http/Controllers/Api/v1/ArticlesController.php b/app/Http/Controllers/Api/v1/ArticlesController.php index f484daee..6104c37e 100644 --- a/app/Http/Controllers/Api/v1/ArticlesController.php +++ b/app/Http/Controllers/Api/v1/ArticlesController.php @@ -58,8 +58,6 @@ public function receive(Request $oRequest) $aPutField = [ "iCategoryId" => $oCategory->id, "iLikeCount" => $aOpt["iLikeCount"] ?? "skip", - "i7like" => $aOpt["i7like"] ?? "skip", - "i365like" => $aOpt["i365like"] ?? "skip", "iIsTop" => $aOpt["iIsTop"] ?? "skip", "sThumb" => $aOpt["sThumb"] ?? "skip", ]; @@ -72,6 +70,13 @@ public function receive(Request $oRequest) if (!$oArticle) { $oArticle = new Articles(); $oArticle->sSlug = $sSlug; + $overrides = []; + foreach (['i7like' => 'seven_day', 'i365like' => 'yearly'] as $field => $key) { + if (isset($aOpt[$field]) && $aOpt[$field] !== 'skip') $overrides[$key] = $aOpt[$field]; + } + foreach (app(\App\Services\ArticleLikeDefaults::class)->newArticleFields('legacy_other', $overrides) as $field => $value) { + $oArticle->{$field} = $value; + } } foreach ($aPutField as $k => $v) { @@ -113,7 +118,6 @@ public function receiveShadowrocketids(Request $oRequest) $sSlug = 'ssi'.date("Ymd"); // $sImgAuthor = "tg_xiuren_a"; $sSubKey = $_ENV['site_code_short'].'::ssi'; - $i7like = $aData["7like"] ?? 0; $oThumbNum = ArticleThumbNum::firstOrCreate(["author_code" => $sSubKey, "type" => "shadowrocketids"]); $iThumbNum = $oThumbNum->num; @@ -156,7 +160,8 @@ public function receiveShadowrocketids(Request $oRequest) // 只有新创建时才写入初始点赞数 if (!$oArticle) { - $aAttributes['i7like'] = $i7like; + $overrides = isset($aData['7like']) ? ['seven_day' => $aData['7like']] : []; + $aAttributes += app(\App\Services\ArticleLikeDefaults::class)->newArticleFields('shadowrocketids', $overrides); } $oArticle = Articles::updateOrCreate( @@ -192,7 +197,6 @@ public function receiveFreenode(Request $oRequest) $sSlug = 'fn'.date("Ymd"); // $sImgAuthor = "tg_xiuren_a"; $sSubKey = $_ENV['site_code_short'].'::fn'; - $i7like = $aArticle["7like"] ?? 0; $oThumbNum = ArticleFreenodeThumbNum::firstOrCreate(["author_code" => $sSubKey]); $iThumbNum = $oThumbNum->num; @@ -235,7 +239,8 @@ public function receiveFreenode(Request $oRequest) // 只有新创建时才写入初始点赞数 if (!$oArticle) { - $aAttributes['i7like'] = $i7like; + $overrides = isset($aArticle['7like']) ? ['seven_day' => $aArticle['7like']] : []; + $aAttributes += app(\App\Services\ArticleLikeDefaults::class)->newArticleFields('freenode', $overrides); } $oArticle = Articles::updateOrCreate( diff --git a/app/Services/AppleIdArticleLayout.php b/app/Services/AppleIdArticleLayout.php new file mode 100644 index 00000000..6b3b7739 --- /dev/null +++ b/app/Services/AppleIdArticleLayout.php @@ -0,0 +1,79 @@ +loadHTML('

在安卓手机上,FlClash 可以读取 Clash 格式配置。下面从安装开始,把本站订阅导入到手机,再开启连接。
从客户端下载页打开 FlClash 官方发布页,展开 Assets,下载 Android APK。多数较新的安卓手机使用 ARM64,文件名通常包含 arm64-v8a;不确定时先查看设备架构,或选择发布页提供的兼容通用包。
下载完成后打开 APK。若系统提示此来源没有安装权限,只为本次使用的浏览器或文件管理器允许安装,然后返回继续。安装完成后打开 FlClash;不需要给它开启与连接无关的权限。
这里粘贴的是订阅链接,不是浏览器正在显示的文章网址。本站的 V2ray 订阅适合另一类客户端;若想使用它,可以看v2rayNG 使用教程。
到 FlClash 的仪表盘把模式设为 规则,在“代理”页打开出口代理组并选择节点。再回到仪表盘点击启动按钮。
第一次启动会出现安卓系统的 VPN 连接请求。确认应用名称为 FlClash 后允许;系统显示 VPN 标识,说明接管已启动,但还要打开网页确认节点真正可用。手机上不需要照搬电脑的“开启系统代理”步骤。
保持 FlClash 运行,切回浏览器打开目标网页。如果一直加载,换一条节点,再重新打开网页测试。不要同时启动两个 VPN 客户端。
节点失效时,回到“配置”更新这一份订阅,再选择节点。若旧订阅已经不可用,到本站首页获取新的地址。
如果一锁屏或切换应用就断开,在系统应用设置中检查 FlClash 的电池和后台运行限制。只调整这个应用需要的后台权限;手机厂商的设置名称可能不同。
结束使用时,回 FlClash 点击停止。系统 VPN 标识消失后,设备恢复原有连接方式。
APK 提示不兼容。 先检查 Android 版本和安装包架构;下载电脑端安装包或不匹配的 CPU 版本,换节点也解决不了。
导入失败。 核对格式和链接完整性,再检查手机当前网络能否下载订阅。只有节点下载成功后,才进入连接排查。
能看到节点但一直超时。 更新订阅,尝试不同节点;免费资源可能整批失效,必要时换一批分享。
参考:FlClash 官方项目与下载。


客户端负责读取配置并建立连接,本站提供的是可以导入的免费订阅。先按设备选一个客户端,完成一次连接即可,不用把表里的软件都装一遍。
| 设备 | 本站新手教程使用的软件 | 操作教程 |
|---|---|---|
| Windows | Clash Verge Rev | Windows 开始使用 |
| Mac | Clash Verge Rev | Mac 开始使用 |
| Android | FlClash | 安卓开始使用 |
| iPhone / iPad | Hiddify | iPhone / iPad 开始使用 |
| Linux 桌面 | Clash Verge Rev | Linux 开始使用 |
| 兼容的 OpenWrt 路由器 | OpenClash | 路由器开始使用 |
Windows 选对应架构的安装包;Mac 选 DMG;Linux 按发行版选 DEB 或 RPM。用它导入本站的 Clash / Mihomo 订阅。旧 Clash for Windows 的用户可阅读迁移教程。
FlClash 也提供桌面版本,本套新手教程使用它的 Android 版本。安卓手机下载 APK,先确认 CPU 架构;导入本站的 Clash / Mihomo 订阅。
本站 iOS 教程使用 Hiddify,先导入 Sing-box / Hiddify 订阅。Hiddify 也支持其他平台,但它们的安装方式和系统授权不完全相同。
已在使用其他软件时,可沿用自己的客户端。以下是对应的官方入口;价格、地区供应和系统要求以商店页面为准:
| 客户端 | 官方入口 | 选择时留意 |
|---|---|---|
| v2rayN | 发行版本 | 按系统选择包,不把桌面版本当安卓 APK |
| v2rayNG | 发行版本 | Android;本站 V2ray 格式;有现成教程 |
| Clash Meta for Android | 发行版本 | Android;本站 Clash 格式;有现成教程 |
安装前确认 OpenWrt 固件、包管理器、处理器与依赖。插件和运行内核分别准备;固件 APK 与安卓 APK 不是同一种安装包。操作流程见OpenClash 新手教程。
GitHub 发布页里的 Assets 是发行文件列表,Source code 是源码。找下载文件时先读文件名中的系统与架构,不必下载整个源码仓库。
安装完成后,回新手指引选择订阅格式,再进入对应设备教程。客户端有了、配置有了,还要开启代理或 VPN,才能开始验证连接。


iPhone 和 iPad 可以使用 Hiddify 添加订阅并连接。它提供客户端功能,节点需要另外导入;下面使用本站公开分享的免费订阅。
打开Hiddify 的 App Store 页面,确认名称为 Hiddify Proxy & VPN,开发者为 Holistic Resilience。根据商店页面显示的系统要求安装,然后打开应用。
应用能否下载取决于账号所在商店地区与设备兼容性。若所在地区未提供该应用,可以到客户端下载与选择查看其他 iOS 客户端;不同软件的订阅格式与操作不完全相同,不要直接混用步骤。
在 Safari 打开免费订阅区,复制 Sing-box / Hiddify 订阅。回到 Hiddify,点击 +,选择“从剪贴板添加”(Clipboard);系统询问是否允许粘贴时,确认允许。
也可以使用“手动添加”(Manually):名称填写自己能识别的名字,例如“本站免费节点”,在 URL 中粘贴完整订阅地址,点击添加。返回首页,确认当前配置是刚导入的那一份。
若提示解析错误,先确认没有把文章网址当成订阅,并更新 Hiddify。格式兼容仍有问题时,可按客户端支持情况改试本站的 V2ray 通用订阅,不必把错误格式反复粘贴。
点击首页的连接按钮。首次使用时,iOS 会询问是否允许添加 VPN 配置,确认来自 Hiddify 后点击允许,并完成系统要求的身份验证。
等应用显示已连接,再打开 Safari 访问目标网页。VPN 已连接代表设备启用了这条连接通道,不保证当前节点能访问每一个网站。 实际网页正常加载,才完成这一步。
如需换节点,打开“代理”(Proxies)页,选择另一个可用节点,再重新加载网页。不同版本的自动选择策略可能不同,始终以当前选中的配置和代理页显示为准。
节点失效时,使用配置卡片或配置菜单的更新操作,等待订阅刷新。旧地址不再有效时,回本站首页获取新一批分享并重新添加。
停止使用时,回到 Hiddify 点击连接按钮断开。不需要为了断开而删除整个 VPN 配置,下次使用仍可继续连接。
添加后没有节点。 查看导入是否报错、当前是否选中新配置,以及订阅内容是否仍然有效。
一直连接中。 检查 VPN 授权是否完成,先断开其他 VPN,再换节点。连接一个失效节点时,反复切开关通常不会改善。
Wi-Fi 能用,蜂窝网络不能用。 检查 Hiddify 是否获准使用蜂窝数据,并分别确认两种网络下能否更新订阅。


这篇教程面向有图形桌面的 Linux 电脑。使用 Clash Verge Rev 导入本站订阅,再让浏览器通过系统代理访问;无桌面的服务器不按这套图形界面步骤操作。
从客户端下载页进入 Clash Verge Rev 官方安装入口。Ubuntu、Debian 系通常选 DEB,Fedora 系通常选 RPM;还要核对当前发行版是否满足该版本的运行依赖。
在终端运行 uname -m 查看处理器架构:x86_64 对应 x64,aarch64 对应 ARM64。安装包格式和 CPU 架构要同时匹配,只看文件扩展名不够。
下载后双击安装包,用系统软件安装器完成安装,再从应用菜单打开。若双击不能安装,可以在下载目录使用对应包管理器;下面的文件名要替换成实际下载的名称,只运行适合自己系统的一条。
# Debian / Ubuntu
sudo apt install ./实际文件名.deb
# Fedora
sudo dnf install ./实际文件名.rpm
若提示缺依赖,先通过发行版包管理器处理,不用强制忽略依赖。
打开本站免费订阅区,复制 Clash / Mihomo 订阅。进入客户端“订阅”页,粘贴、导入,再选中新出现的配置卡片。
随后打开“代理”页,选择 规则 模式,在出口代理组中选择一个节点或自动选择组。列表有节点,说明配置已经读到;接下来才是设备的接管设置。
在客户端首页或设置页打开 系统代理,保持客户端运行,重新打开浏览器的目标网页。
Linux 桌面环境和应用对系统代理的支持不同。如果网页没有变化,先检查浏览器是否使用系统代理,而不是独立代理设置。Firefox 可以在“设置 → 网络设置”中确认代理来源。
这里先让浏览器连通。不需要一开始就同时改环境变量、全局路由和 DNS,否则很难判断究竟是哪一项生效。
浏览器可用不代表 curl、Git 等命令自动使用相同代理。终端工具可能读取自己的代理选项或环境变量。
想验证单条命令,可以继续看Linux 完整教程里的终端代理示例,使用客户端显示的实际监听端口;不要把别人的端口直接当作自己的设置。需要更广的接管范围时,再阅读系统代理与 TUN。


Mac 上可以用 Clash Verge Rev 管理免费订阅。先选对安装包,接着导入配置并开启系统代理,就能开始检查浏览器连接。
点左上角苹果菜单,打开“关于本机”:显示 Apple M 系列芯片时选择 ARM64 / aarch64,显示 Intel 时选择 x64 / x86_64。从客户端下载页进入官方安装页面,确认当前版本的 macOS 要求,再下载对应的 DMG。
打开 DMG,把 Clash Verge Rev 拖进“应用程序”文件夹,然后从“应用程序”启动。不要一直从安装镜像里运行,也不必把芯片架构问题当作订阅故障。
若系统拦截打开,先核对下载来源与系统兼容性,按官方 Mac 常见问题处理对应提示。不要为了安装一个应用关闭整台 Mac 的安全检查。
打开免费订阅区,复制 Clash / Mihomo 的地址。在 Clash Verge Rev 的“订阅”页粘贴并导入;新的卡片出现后,点击选中它。
如果订阅列表已出现卡片,“代理”页却没有预期节点,先回到“订阅”页检查是否选中了新配置,再执行一次更新。
在“代理”页选择 规则 模式,在出口代理组里选一条节点,或选可用的自动选择组。随后在首页或设置页开启 系统代理。
保持客户端运行,打开 Safari 或其他浏览器访问目标网站。遇到系统请求授权时,确认请求来自刚安装的客户端,再完成对应操作。
规则模式会按配置决定哪些连接直连、哪些走节点;不是所有访问都会变成同一个出口。想理解这种分流,可以看规则模式与代理组。
免费节点不可用时,在“订阅”页更新并尝试另一条节点。若旧地址已经没有有效内容,重新从首页获取当前分享。
结束使用时,先关闭系统代理,再退出 Clash Verge Rev。Mac 左上角的红色关闭按钮可能只是关掉窗口,菜单栏图标仍表示应用在运行。
应用打不开。 确认芯片架构、macOS 版本,以及应用是否已复制到“应用程序”;这时还没进入订阅连接阶段。
Safari 能用,某个应用不能用。 检查该应用是否独立配置代理。若它不支持系统代理,再了解TUN 的接管范围。
退出后网页也打不开。 查看系统网络设置中的代理是否仍启用;也可以重新打开客户端,关闭系统代理后正常退出。
需要更详细的步骤,可以看Mac 完整使用教程;更换其他设备则返回新手指引。


OpenClash 运行在兼容的 OpenWrt 路由器上,可以为经过这台路由器的设备处理代理流量。它不是安装在普通手机上的 App,也不是所有品牌路由器都能直接安装。
本文从路由器已经能正常上网开始,不包含刷机、解锁和旁路由搭建。若只是想先体验免费节点,建议先完成手机或电脑教程。
登录路由器后台,到“系统 → 备份 / 升级”保存当前配置。接着查看OpenClash 官方安装说明,确认固件、CPU 架构、存储空间和依赖满足要求。
按照固件使用的软件包管理器选择安装包:使用 opkg 的固件对应 IPK,使用 apk 的固件对应 APK。这里的 APK 是 OpenWrt 软件包,不是 Android 安装包。 有内置插件商店的固件,也应核对它提供的版本与依赖。
安装完成后,刷新后台,打开“服务 → OpenClash”。在版本或内核管理页面下载与路由器架构匹配的 Meta / Mihomo 内核。插件界面已出现,不等于内核已经装好;若已有插件和正常内核,可继续下一步。
clash.meta 类型。如果更新失败,先检查路由器自身能否联网和下载该地址。电脑浏览器能打开网站,不等于路由器后台的下载请求也一定能成功。
在“配置管理”切换到新下载的配置,回“运行状态”启动 OpenClash。确认内核运行后,打开控制面板的代理页面,选择 规则 模式,并在出口代理组中选择节点。
若提示内核不存在、架构不支持或配置校验失败,先处理日志中对应的问题,不要把插件“已启用”当作连接成功。
若它是家中实际使用的主路由,让手机连接它的 Wi-Fi,或让电脑接入 LAN 口,沿用原本正常的自动获取 IP 和 DNS 设置。暂时停止测试设备上其他 VPN 或代理,再打开网页验证。
若使用的是旁路由,先确认既有网络的网关、转发与设备接入方式已经正确设置。不要仅凭这张示意图修改全网网关或 DNS。
启用后整个网络出问题,先停用 OpenClash,确认原有网络恢复,再检查插件日志与配置。保持本地管理入口可用,避免在没有恢复途径时反复改全网设置。
只有个别节点不能用,就更新订阅或换节点;需要换一批资源时回本站首页。其他设备教程见新手指引,规则分流说明见规则、全局与直连。


第一次使用本站,可以从这里开始。你需要做三件事:安装客户端、导入免费订阅、开启连接。先选自己的设备,照着对应教程完成一遍;暂时不用研究 DNS、TUN 或复杂规则。
只想找下载地址,或者想比较其他客户端,可以看客户端下载与选择。路由器教程需要兼容的 OpenWrt 固件;第一次使用,先在手机或电脑上连通更容易判断问题。
打开本站首页,找到“获取免费订阅”。订阅是让客户端获取一组节点和配置的地址,复制订阅地址,不是复制当前文章的网址。也不用把整篇文章的文字粘贴进去。
| 你使用的客户端 | 在本站复制的订阅 |
|---|---|
| Clash Verge Rev、FlClash、OpenClash | Clash / Mihomo |
| Hiddify | Sing-box / Hiddify |
| v2rayNG、Shadowrocket | V2ray / Shadowrocket |
客户端下载和节点订阅是两件事。安装软件不会自动获得节点;导入成功,也不代表已经开启连接。免费节点的可用性会变化,页面里的节点数量和检测结果供挑选时参考,实际能否使用还要在自己的网络上打开网页确认。
电脑上按教程开启系统代理;手机上启动客户端并允许系统的 VPN 请求。保持客户端运行,打开一个平时需要通过代理访问的网页。能正常加载后,再试自己实际要用的应用。
日常先使用客户端的规则模式。想了解“为什么有的网站走节点、有的直接访问”,接着看规则、全局与直连。如果需要更细的配置、旧客户端迁移或专项排错,可以进入综合教程。


在 Windows 电脑上,先用 Clash Verge Rev 完成一次浏览器连接。整个过程不需要手工填写服务器地址,也不需要先修改 DNS。
从客户端下载页的 Clash Verge Rev 入口进入官方下载。Windows 10 / 11 的普通 Intel、AMD 64 位电脑选择 Windows x64;ARM 电脑选择 ARM64。可以在“设置 → 系统 → 系统信息”的系统类型中确认。
下载 Windows 安装包后双击安装,再从开始菜单打开 Clash Verge Rev。Source code 是源代码压缩包,不是安装程序;Windows 7 也不要直接套用这套安装步骤。
如果提示格式错误,先确认没有复制 V2ray 订阅或文章地址。若提示连接失败,检查电脑能否下载这个地址;不要反复重装客户端来处理下载问题。
打开“代理”页面,模式先选 规则。展开用于选择出口的代理组,选择一个节点,或选择订阅提供的自动选择组。代理组的名称由订阅决定,不一定叫同一个名字。
回到首页或设置页,找到并开启 系统代理。保持 Clash Verge Rev 运行,然后重新打开浏览器中的目标网页。节点显示延迟只是一个参考,网页实际能否加载更重要。

下次打开客户端,检查选中的订阅、节点和系统代理即可。节点变慢或失效时,先在订阅卡片上更新,再切换节点;旧订阅更新后仍不可用,就到本站获取新一批分享。
结束使用时,先关闭系统代理,再退出客户端。只关闭窗口通常不等于退出,留意任务栏托盘中的运行状态。
节点列表有内容,浏览器仍打不开。 确认系统代理开着、当前配置已选中;若浏览器有独立代理扩展,检查它是否覆盖系统设置。随后换一条节点并重新打开网页。
浏览器能用,游戏或终端不行。 有些程序不读取系统代理。这时再看系统代理与 TUN 的选择,不必为了第一次浏览网页同时打开所有开关。
需要更详细的安装与排错。 可以继续读Clash Verge Rev Windows 完整教程,或返回新手指引选择其他设备。

