.htaccess 变量问题无法识别 header 格式 %

.htaccess Variables Issue Unrecognized header format %

我正在为我的一个站点构建一种内容安全策略生成器。我被它的 .htaccess 部分的一个特定部分难住了

生成的.htaccess是:

# Media Sources
SetEnv CSP_Media "media-src 'self' ;"

# Default Sources
SetEnv CSP_Default "default-src 'self' kevinpirnie.com ;"

# Add the CSP Headers
SetEnv CSP "%{ENV:CSP_Default} %{ENV:CSP_Media}"
Header always set Content-Security-Policy %{ENV:CSP}
Header always set X-Content-Security-Policy %{ENV:CSP}

当我将引号从 SetEnv CSP 行中删除时,我得到了一个不同的错误:SetEnv takes 1-2 arguments 这是有道理的......但是在它们周围的引号中,我得到了 Unrecognized header format %错误

有什么想法可以为此利用变量,或者如何解决 header format 问题?

这里有几个问题...

SetEnv CSP "%{ENV:CSP_Default} %{ENV:CSP_Media}"

这实际上将 CSP 环境变量设置为文字值 %{ENV:CSP_Default} %{ENV:CSP_Media} - CSP_DefaultCSP_Media 环境变量未展开。据我所知,无法在 SetEnv 指令的值参数中引用环境变量。

您可以使用 mod_rewrite(或 SetEnvIfExpr - 见下文)来创建此 CSP 环境变量,它是两个现有环境变量的串联,由 space.

但是,SetEnv (mod_env) 在 mod_rewrite 请求中处理得太晚(处理得非常早),无法读取这些环境变量。所以你需要使用 SetEnvIf (mod_setenvif) 来代替(或者使用 mod_rewrite 来设置初始环境变量)。

例如:

RewriteEngine On

# Media Sources
SetEnvIf ^ ^ "CSP_Media=media-src 'self' ;"

# Default Sources
SetEnvIf ^ ^ "CSP_Default=default-src 'self' kevinpirnie.com ;"

# Add the CSP Headers
RewriteRule ^ - "[E=CSP:%{ENV:CSP_Media} %{ENV:CSP_Default}]"

注意战略性放置的 double-quotes 因为 value 参数包含 spaces.

  • SetEnvIf - SetEnvIf 指令中的整个 name=value 对必须用双引号括起来(而不是 value).

  • RewriteRule - 整个 flags 参数需要用双引号括起来(而不是 value).

更新: 您可以避免在上面使用 mod_rewrite 并使用 SetEnvIfExpr 指令代替使用 [= 连接环境变量40=] (Apache 2.4).

例如:

# Add the CSP Headers
SetEnvIfExpr "reqenv('CSP_Media').' '.reqenv('CSP_Default') =~ /(.*)/" CSP=

表达式左轴上的点 (.) 是字符串连接运算符(很像 PHP)。它们不作为正则表达式 (RHS) 捕获的字符串的一部分出现,并用作 </code> 反向引用中的串联 <em>value</em>。</p> <h3>访问 <code>Header 指令中的环境变量

Header always set Content-Security-Policy %{ENV:CSP}
Header always set X-Content-Security-Policy %{ENV:CSP}

mod_headers 使用不同的语法来访问环境变量的值,因此出现“无法识别的 header 格式 %”错误。您需要改用 %{var}e

例如:

Header always set Content-Security-Policy %{CSP}e
Header always set X-Content-Security-Policy %{CSP}e

或者,您可以通过不创建中间 CSP env var 来避免 mod_rewrite 和 mod_setenvif,只需将它们组合在 Header指令。

例如:

# Media Sources
SetEnv CSP_Media "media-src 'self' ;"

# Default Sources
SetEnv CSP_Default "default-src 'self' kevinpirnie.com ;"

# Add the CSP Headers
Header always set Content-Security-Policy "%{CSP_Media}e %{CSP_Default}e"
Header always set X-Content-Security-Policy "%{CSP_Media}e %{CSP_Default}e"

因为 spacevalue 参数需要用双引号括起来。


I am building out a sort of Content Security Policy generator for one of my sites.

不过,如果此代码是“auto-generated”(?) 那么为什么不一步生成完整的 Header