Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache .htaccess变量发出无法识别的标题格式%_Apache_.htaccess_Content Security Policy_Mod Headers - Fatal编程技术网

Apache .htaccess变量发出无法识别的标题格式%

Apache .htaccess变量发出无法识别的标题格式%,apache,.htaccess,content-security-policy,mod-headers,Apache,.htaccess,Content Security Policy,Mod Headers,我正在为我的一个站点构建一种内容安全策略生成器。我被.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 &q

我正在为我的一个站点构建一种内容安全策略生成器。我被.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接受1-2个参数,这很有意义。。。但是,有了引号,我得到了
无法识别的头格式%
错误


我能做些什么来利用变量,或者如何解决
标题格式的问题?

这里有一些问题

这实际上将
CSP
环境变量设置为文本值
%{ENV:CSP_Default}%{ENV:CSP_Media}
-未展开
CSP_Default
CSP_Media
环境变量。AFAIK在
SetEnv
指令的value参数中无法引用env变量

您可以使用mod_rewrite(或
SetEnvIfExpr
-见下文)来创建此
CSP
env变量,它是两个现有env变量的串联,由一个空格分隔

但是,
SetEnv
(mod_env)在mod_rewrite请求中处理得太晚(处理得很早),无法读取这些env变量。因此,您需要使用
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}]"
# Add the CSP Headers
SetEnvIfExpr "reqenv('CSP_Media').' '.reqenv('CSP_Default') =~ /(.*)/" CSP=$1
Header always set Content-Security-Policy %{CSP}e
Header always set X-Content-Security-Policy %{CSP}e
# 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"
请注意按策略放置的双引号,因为value参数包含空格

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

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

UPDATE:您可以避免在上面使用mod_rewrite,而是使用
SetEnvIfExpr
指令使用(Apache 2.4)连接环境变量

例如:

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}]"
# Add the CSP Headers
SetEnvIfExpr "reqenv('CSP_Media').' '.reqenv('CSP_Default') =~ /(.*)/" CSP=$1
Header always set Content-Security-Policy %{CSP}e
Header always set X-Content-Security-Policy %{CSP}e
# 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"
表达式左侧的点(
)是字符串连接运算符(与PHP非常相似)。它们不会显示为正则表达式(RHS)捕获的字符串的一部分,并用作
$1
反向引用中的串联值

访问
标题
指令中的环境变量 mod_headers使用不同的语法访问env vars的值,因此出现“Unrecognized header format%”错误。您需要改用
%{var}e

例如:

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}]"
# Add the CSP Headers
SetEnvIfExpr "reqenv('CSP_Media').' '.reqenv('CSP_Default') =~ /(.*)/" CSP=$1
Header always set Content-Security-Policy %{CSP}e
Header always set X-Content-Security-Policy %{CSP}e
# 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"

或者,您可以避免mod_rewrite和mod_setenif,方法是不创建中间
CSP
env变量,只需将它们组合到
标题
指令中即可

例如:

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}]"
# Add the CSP Headers
SetEnvIfExpr "reqenv('CSP_Media').' '.reqenv('CSP_Default') =~ /(.*)/" CSP=$1
Header always set Content-Security-Policy %{CSP}e
Header always set X-Content-Security-Policy %{CSP}e
# 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"
由于空间的原因,value参数需要用双引号括起来


我正在为我的一个网站制定一种内容安全策略生成器


尽管如此,如果此代码是“自动生成的”(?),那么为什么不在一个步骤中生成完整的
标题呢?

谢谢您,怀特先生。我会在几天后调查这一切。。。目前正在使用非常需要的PTO:)来回答您的最后一个问题,不过。。。用于组织目的,并具有更好的易读性。最终,我不会是唯一一个必须查看生成的规则的人:)这确实起到了作用。感谢againI,我更新了我的答案,加入了使用mod_rewrite连接两个环境变量的替代方法(创建组合的
CSP
env var)。因为这也可以通过使用
SetEnvIfExpr
(也是mod_setenvif的一部分)来实现,尽管语法可能不够简洁/可读。