如何保护 Web 字体文件
目标是防止盗链,阻止其他网站在未经许可的情况下使用您的字体文件,同时确保您的访问者能够正常使用。
1.
在 Apache 上使用 .htaccess 保护
将 Web 字体文件上传到您网站的 www.yourdomain.com 上一个名为 /fonts/ 的子目录后,在此目录中找到或创建一个名为 .htaccess 的新文件,并将以下行粘贴到其中:
# 启用重写引擎
RewriteEngine On
# 阻止字体文件的盗链
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.(com|local) [NC]
RewriteRule \.(woff2?|ttf|eot|svg)$ - [NC,F,L]
# 禁用目录列表(可选但推荐)
Options -Indexes
将 yourdomain.com 替换为您自己的主机名。
com 前面的点必须用反斜杠转义。
(www.) 部分表示该规则接受带或不带 www 前缀的域名。
(s)? 部分表示该规则同时适用于 HTTP 和 HTTPS。
这些规则会阻止所有不是来自您域名的字体请求。服务器在这些情况下会返回 403 错误。
Options -Indexes 阻止 fonts 文件夹内的目录列表。
如果您遇到 500 错误,说明您的主机不允许覆盖 .htaccess。请将相同的规则移动到主 Apache 配置中。
如果您使用 IIS,请使用可用的导入工具将这些规则转换为 IIS 重写规则。
某些浏览器和扩展程序不会发送引荐来源信息。当这种情况发生时,字体可能无法加载,浏览器将使用后备字体。
2.
使用 CORS 标头(更现代的方法)
对于更依赖浏览器强制执行的方法,您可以使用跨域资源共享(CORS)标头来指定允许哪些域名请求您的字体。
将此代码添加到您的 .htaccess 文件中(可以与盗链规则结合使用):
# 仅允许来自您域名的字体访问
<filesmatch "\.(woff2?|ttf|eot|svg)$"="">
Header set Access-Control-Allow-Origin "https://www.yourdomain.com"
# 如果您不使用 'www',请使用下面这行
# Header set Access-Control-Allow-Origin "https://yourdomain.com"
工作原理: 当来自不同域名的页面尝试加载您的字体时,现代浏览器会检查此标头。如果请求页面的域名不在允许列表中,浏览器本身会阻止该请求。
3.
通过 CDN 的解决方案(Cloudflare 等)
如果您使用像 Cloudflare 这样的 CDN,请启用其内置的盗链保护功能:
-
登录您的 Cloudflare 仪表板。
-
转到 Scrape Shield(或根据您的仪表板版本,在 Security > Scrape Shield 下)。
-
打开 “Hotlink Protection”(盗链保护)。
-
Cloudflare 将自动拦截并阻止不是来自您自己域名的图片(以及通常其他资产)请求。
注意: “将字体文件放在名为 hotlink-ok 的目录中”这一建议并非有效的 Cloudflare 功能,应予以忽略。
This post is also available in EN.