为什么`mod_headers`根据内容类型无法匹配?

时间:2016-03-21 22:01:54

标签: .htaccess html5boilerplate mod-headers

我不能围绕评论和编码方式,只为.html设置一个标题,例如html5样板文件中的.htaccess文件。

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

<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>

1 个答案:

答案 0 :(得分:1)

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

应在所有文档上设置CSP,但为了节省标题带宽,不需要在这些文档使用的资源上设置(例如图像,样式表,javascript等)。除了浪费带宽之外,将其设置在其他文档上并没有什么坏处。

理想情况下,您可以根据返回的mime类型设置它(在上面的PHP示例中将是HTML)。因此,只要返回HTML文档,然后设置它,否则不要。但是,由于这是不可能的,因此您有两种选择:

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

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

  3. 第一个选项是更安全的选项。特别是对于html5boiler板块,他们不知道将在其上使用的网站上使用什么技术。站点可能使用.php,.cgi,.asp或任意数量的技术来生成HTML文档。他们甚至可以将请求代理到后端服务器,因此它们不会是文件扩展名。

    有意义吗?