"Lighthouse was unable to download a robots.txt file" 尽管文件可访问

"Lighthouse was unable to download a robots.txt file" despite the file being accessible

我在 http://www.schandillia.com. The project has a robots.txt file accessible at http://www.schandillia.com/robots.txt 有一个 NodeJS/NextJS 应用 运行ning。截至目前,该文件是用于测试目的的基本文件:

User-agent: *
Allow: /

但是,当我 运行 在我的站点上进行 Lighthouse 审核时,它抛出 抓取和索引错误 说它无法下载 robots.txt 文件。我再说一遍,该文件位于 http://www.schandillia.com/robots.txt.

如果您需要查看该项目的代码库,请访问 https://github.com/amitschandillia/proostrobots.txt 文件位于 proost/web/static/ 但由于我的 Nginx 配置中的以下内容,可以在根目录下访问:

# ... the rest of your configuration
  location = /robots.txt {
    proxy_pass http://127.0.0.1:3000/static/robots.txt;
  }

可在 github https://github.com/amitschandillia/proost/blob/master/.help_docs/configs/nginx.conf 上查看完整的配置文件。

如果有什么地方我忽略了,请指教。

TL;DR: 您的 robots.txt 服务正常,但 Lighthouse 无法正确获取它,因为它的审核当前无法与 connect-src directive of of your site’s Content Security Policy, due to a known limitation which is being tracked as issue #4386 was fixed in Chrome 92 一起使用.


解释: Lighthouse 尝试通过脚本 运行 从您站点的根目录提供的文档中获取 robots.txt 文件。这是它用于执行此请求的代码(在 lighthouse-core 中找到):

const response = await fetch(new URL('/robots.txt', location.href).href);

如果您尝试从您的站点 运行 此代码,您会注意到抛出“拒绝连接”错误:

发生此错误是因为浏览器对您网站提供的 header 实施了内容安全策略限制(为了便于阅读,分为几行):

content-security-policy:
    default-src 'self';
    script-src 'self' *.google-analytics.com;
    img-src 'self' *.google-analytics.com;
    connect-src 'none';
    style-src 'self' 'unsafe-inline' fonts.googleapis.com;
    font-src 'self' fonts.gstatic.com;
    object-src 'self';
    media-src 'self';
    frame-src 'self'

注意 connect-src 'none'; 部分。根据 the CSP spec,这意味着无法使用服务文档中的脚本接口加载 URL。实际上,任何 fetch 都会被拒绝。

这个 header 是由 Next.js 应用程序的服务器层明确发送的,因为您配置 Content Security Policy middleware (from commit a6aef0e 的方式):

import csp from 'helmet-csp';

server.use(csp({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'", '*.google-analytics.com'],
    imgSrc: ["'self'", '*.google-analytics.com'],
    connectSrc: ["'none'"],
    styleSrc: ["'self'", "'unsafe-inline'", 'maxcdn.bootstrapcdn.com'], // Remove unsafe-inline for better security
    fontSrc: ["'self'"],
    objectSrc: ["'self'"],
    mediaSrc: ["'self'"],
    frameSrc: ["'self'"]
  }
}));

Solution/Workaround: 解决审计报告中的问题,您可以:

  • 等待(或提交)Lighthouse 中的修复程序
  • 使用 connect-src 'self' 指令,它的副作用是允许来自 Next.js 应用的浏览器端的 HTTP 请求