.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_Default
和 CSP_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"
因为 space,value 参数需要用双引号括起来。
I am building out a sort of Content Security Policy generator for one of my sites.
不过,如果此代码是“auto-generated”(?) 那么为什么不一步生成完整的 Header
?
我正在为我的一个站点构建一种内容安全策略生成器。我被它的 .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_Default
和 CSP_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"
因为 space,value 参数需要用双引号括起来。
I am building out a sort of Content Security Policy generator for one of my sites.
不过,如果此代码是“auto-generated”(?) 那么为什么不一步生成完整的 Header
?