我的.htaccess
中有这个
SetEnvIfExpr "env('USE_CSP') == 1"\
"CSP_SCRIPT_SRC='self'"
Header always set Content-Security-Policy \
"default-src 'self' ;\
script-scr %{CSP_SCRIPT_SRC}e ;"
现在,当设置了环境变量data:
时,我还希望在允许的CSP协议列表中也有POLYMER_CSP
,所以我有:
SetEnvIfExpr "env('USE_CSP') == 1"\
"CSP_SCRIPT_SRC='self'"
SetEnvIfExpr "env('POLYMER_CSP') == 1"\
"CSP_SCRIPT_SRC='self' data:"
Header always set Content-Security-Policy \
"default-src 'self' ;\
script-scr %{CSP_SCRIPT_SRC}e ;"
但这意味着当我更改CSP_SCRIPT_SRC
的第一个定义时,我必须更改第二个定义:
SetEnvIfExpr "env('USE_CSP') == 1"\
"CSP_SCRIPT_SRC='self' https://*.my.web"
SetEnvIfExpr "env('POLYMER_CSP') == 1"\
"CSP_SCRIPT_SRC='self' data:" # Here, the https://*.my.web has been forgotten
Header always set Content-Security-Policy \
"default-src 'self' ;\
script-scr %{CSP_SCRIPT_SRC}e ;"
所以这很难维护。因此,我想将data:
附加到CSP_SCRIPT_SRC
的现有值上,但是不能使用%{CSP_SCRIPT_SRC}
或%{ENV:CSP_SCRIPT_SRC}
。
Apache documentation for SetEnvIf
说
第三个(
"ENV=value"
)会将变量设置为value给定的文字值。 [...] Apache httpd将识别值中出现的$ 1 .. $ 9并用正则表达式的括号子表达式替换
所以我发现的唯一方法是:
SetEnvIfExpr "env('USE_CSP') == 1"\
"CSP_SCRIPT_SRC='self' https://*.my.web"
SetEnvIfExpr "env('POLYMER_CSP') == 1 && env('CSP_SCRIPT_SRC') =~ /(^.*$)/"\
"CSP_SCRIPT_SRC=$0 data:"
Header always set Content-Security-Policy \
"default-src 'self' ;\
script-scr %{CSP_SCRIPT_SRC}e ;"
但是在SetEnvIfExpr
中是否有一种“更漂亮”的方法来实现这种价值串联?