为什么 `mod_headers` 不能根据 content-type 匹配?

Why `mod_headers` cannot match based on the content-type?

我无法全神贯注于评论和编码方式,为 .html 设置一个 header 例如 html 中的 .htaccess 文件5 个样板文件。

大代码块的线索在于“mod_headers 无法匹配内容类型”(如# 评论)。所以我想 1: 为什么 <FilesMatch> 中有一个 'Header unset' 刚刚被宣布为不可能?

<IfModule mod_headers.c>  

   Header set Content-Security-Policy "script-src 'self'; object-src 'self'"  

   # `mod_headers` cannot match based on the content-type, however,
   # the `Content-Security-Policy` response header should be send
   # only for HTML documents and not for the other resources.  

   <FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|woff2?|xloc|xml|xpi)$">
     Header unset Content-Security-Policy
   </FilesMatch>  

</IfModule>  

我到处都看了,但只登陆了具有相同的,几乎是仪式使用的代码块的页面,没有进一步的解释。所以问题 2: 为什么像这样的简单声明是不可能的?:

<IfModule mod_headers.c>

  # Content-Security-Policy for .html files
  <FilesMatch "\.(html)$">
    Header set Content-Security-Policy "script-src 'self'; object-src 'self'"
  </FilesMatch>

  # OR like this 
  <Files ~ "\.(html)$">
    Header set Cache-Control "public, must-revalidate"
  </Files>  

</IfModule>

可以按照你的第二个例子来做。但是 .html 并不是唯一可以作为文档发送的文件。您还可以使用 .php 或 .htm 或任何其他数量的文件。其中一些(如 .php)可能会执行,然后最终 return HTML 但服务器不知道,因为它在这个阶段只知道文件扩展名。

应在所有文档上设置 CSP,但为了节省 header 带宽,不需要在这些文档使用的资产(例如图像、样式表、javascript... ETC)。除了浪费带宽之外,将它设置在其他文档上并没有真正的危害。

理想情况下,您可以根据 mime-type returned 进行设置(在上面的 PHP 示例中为 HTML)。因此,任何时候 HTML 文档被 returned 然后设置它,否则不要。然而,由于这是不可能的,您有两个选择:

  1. 默认情况下将它设置在所有内容上,然后明确取消对已知媒体类型的设置。这几乎可以保证它将在文档上设置,但也有可能在其他一些文件类型上设置它(例如,如果您没有为该类型明确取消设置)——正如我所说,这并不是那么糟糕。

  2. 明确说明您的 HTML 文档类型(如您的第二个示例)。这里的风险是您现在或将来其他人开始在您的网站上使用 php 时会错过文件类型(例如 .php)。

第一个选项比较安全。特别是对于 html5boiler plate,他们不知道将在其使用的网站上使用什么技术。站点可能使用 .php、.cgi、.asp 或任意数量的技术来生成 HTML 文档。他们甚至可以将请求代理到后端服务器,这样他们就没有文件扩展名了。

有道理吗?