为什么 `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 然后设置它,否则不要。然而,由于这是不可能的,您有两个选择:
默认情况下将它设置在所有内容上,然后明确取消对已知媒体类型的设置。这几乎可以保证它将在文档上设置,但也有可能在其他一些文件类型上设置它(例如,如果您没有为该类型明确取消设置)——正如我所说,这并不是那么糟糕。
明确说明您的 HTML 文档类型(如您的第二个示例)。这里的风险是您现在或将来其他人开始在您的网站上使用 php 时会错过文件类型(例如 .php)。
第一个选项比较安全。特别是对于 html5boiler plate,他们不知道将在其使用的网站上使用什么技术。站点可能使用 .php、.cgi、.asp 或任意数量的技术来生成 HTML 文档。他们甚至可以将请求代理到后端服务器,这样他们就没有文件扩展名了。
有道理吗?
我无法全神贯注于评论和编码方式,为 .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 然后设置它,否则不要。然而,由于这是不可能的,您有两个选择:
默认情况下将它设置在所有内容上,然后明确取消对已知媒体类型的设置。这几乎可以保证它将在文档上设置,但也有可能在其他一些文件类型上设置它(例如,如果您没有为该类型明确取消设置)——正如我所说,这并不是那么糟糕。
明确说明您的 HTML 文档类型(如您的第二个示例)。这里的风险是您现在或将来其他人开始在您的网站上使用 php 时会错过文件类型(例如 .php)。
第一个选项比较安全。特别是对于 html5boiler plate,他们不知道将在其使用的网站上使用什么技术。站点可能使用 .php、.cgi、.asp 或任意数量的技术来生成 HTML 文档。他们甚至可以将请求代理到后端服务器,这样他们就没有文件扩展名了。
有道理吗?