用 Linux 工具链提取并重构 URL 的实操方案
一、目标与总体思路
- 明确目标:从日志、HTML、文本中批量提取 URL,进行去重、规范化、分类,并按业务规则改写为更友好的结构(利于 SEO、统计与迁移)。
- 处理流程:
- 提取:用命令行工具快速抽取候选 URL;
- 规范化:统一协议、域名、端口、路径尾部斜杠、百分号编码等;
- 分类与路由映射:按域名/路径前缀分组,决定是内部重写、外部跳转还是留空;
- 改写与输出:生成 Nginx/Apache 规则、站点地图或跳转清单;
- 验证与灰度:抽样检查、302 试运行、再切换 301 永久重定向。
二、快速提取 URL 的命令行工具
- 基础提取
- grep:grep -Eo ‘https?://[^ ]+’ file
- ripgrep:rg -o ‘https?://[^\s]+’ file(更快,适合大文件)
- 交互浏览
- urlview:cat file | urlview(交互选择并调用默认浏览器)
- 从 HTML 提取链接
- lynx -dump:curl -s url | lynx -dump -listonly | grep -Eo ‘https?://[^\s]+’
- pup(CSS 选择器):curl -s url | pup ‘a attr{href}’ | grep -E ‘^https?://’
- 建议组合:提取 → 去重 → 按域名筛选,例如:
- rg -o ‘https?://[^\s]+’ access.log | sort -u | grep -E ‘^https?://(www.)?example.com/’ > urls.txt
- 以上工具在终端提取与处理 URL 上高效、可脚本化,适合批量与自动化场景。
三、规范化与结构化处理要点
- 统一格式
- 强制小写、去除默认端口(如 :80/:443)、保留或统一尾部斜杠(建议目录统一有斜杠、文件无斜杠)、合并连续的斜杠。
- 解码后再按需编码,避免双重编码;对中文、空格、#、% 等做安全转义。
- 相对路径转绝对路径
- 若页面中仅有相对链接(如 /path/file 或 …/img/a.png),需以页面 URL 为基准解析为绝对 URL,保证后续重写/跳转的一致性。
- 去噪与分组
- 过滤掉 mailto:、javascript:、tel: 等非 HTTP(S) 链接;
- 按二级/三级域名、路径前缀(如 /blog/、/product/)分组,便于分站点或分业务线改写。
- 示例(GNU coreutils + sed,按需增删规则)
- 小写、去默认端口、去多余斜杠:
- sed -E ‘s|https?://([^/:]+)(:[0-9]+)?|https://\L\1|g; s|/+|/|g; s|/$||’
- 仅保留本站域名:
- grep -E ‘^https?://(www.)?example.com/’
- 规范化是重写的前提,能显著降低后续规则复杂度与误匹配率。
四、按 Web 服务器改写 URL 的落地示例
- Nginx
- 目录化:将 /article.php?id=123 改为 /article/123/(SEO 友好)
- rewrite ^/article.php?id=(\d+)$ /article/$1/ permanent;
- 文件化:将 /page/about.html 改为 /about
- rewrite ^/page/(.+).html$ /$1 permanent;
- 条件与后缀:对不存在的资源尝试 .html 回退
- if (!-f $request_filename) { rewrite ^/(.+)$ /$1.html last; }
- 标记说明:last 内部重写继续匹配;redirect 返回 302;permanent 返回 301。
- 修改后执行:nginx -t && nginx -s reload
- Apache(mod_rewrite)
- 开启模块与目录覆盖:
- LoadModule rewrite_module modules/mod_rewrite.so
- <Directory “/var/www/html”> AllowOverride All
- 规则示例(同上语义):
- RewriteEngine On
- RewriteRule ^/article.php?id=(\d+)$ /article/$1/ [R=301,L]
- RewriteRule ^/page/(.+).html$ /$1 [R=301,L]
- 使配置生效:systemctl restart httpd(或 graceful)
- 迁移与灰度建议
- 先 302 试运行观察日志与业务指标,再切换 301 永久重定向;
- 对高流量入口分批上线,避免集中冲击缓存与搜索引擎抓取器。
五、批量改写与验证的一体化脚本
- 场景:从站点地图或页面列表中提取 URL,按规则改写并输出 Nginx 规则或跳转清单。
- 示例(Bash + pup + rg,需提前安装 pup、ripgrep)
- 提取并规范化
- curl -s https://example.com/sitemap.xml
| pup ‘urlset url loc text{}’
| rg -o ‘https?://[^\s]+’
| sed -E ‘s|https?://([^/:]+)(:[0-9]+)?|https://\L\1|g; s|/+|/|g; s|/$||’
- 生成 Nginx 301 规则(示例:/article.php?id=123 → /article/123/)
- | awk -F’[?=&]’ ‘{if($1~/^/article.php/ && $2==“id”) printf “rewrite ^%s$ /article/%s/ permanent;\n”, $1, $3}’ \
nginx_rewrite.conf
- 抽样验证(检查命中与返回码)
- head -n 10 urls.txt | xargs -I{} curl -Is {} | egrep ‘^HTTP/1.[01] [23]’
- 可扩展为按域名分文件、自动去重、生成站点地图或报表,便于审计与回滚。