RewriteEngine On
# Set SHOP_VALUE env var to value of "shop" URL parameter (if any)
RewriteCond %{QUERY_STRING} (?:^|&)shop=([^&]+)
RewriteRule ^ - [E=SHOP_VALUE:%1]
# Set header conditionally on whether SHOP_VALUE is set and use this in the header value
# NB: You might need to use REDIRECT_SHOP_VALUE here instead depending on other directives
Header set Content-Security-Policy %{SHOP_VALUE}e env=SHOP_VALUE
1条答案
按热度按时间svmlkihl1#
你可以使用mod_rewrite来根据查询字符串设置一个环境变量,并根据是否设置了这个env变量来有条件地设置
header
,同时在头值中使用这个env变量。(这里不能使用SetEnvIf
,因为SetEnvIf
无法访问URL的查询字符串部分。)例如,以下设置并使用
SHOP_VALUE
env var:根据上面的代码注解,您可能需要将
Header
指令中的SHOP_VALUE
更改为REDIRECT_SHOP_VALUE
。这取决于你是否有其他的mod_rewrite指令触发一个“循环”(例如:前端控制器模式)-此时用REDIRECT_
前缀重命名env变量。(在Apache 2上。4您可以在RewriteRule
指令上使用 hardEND
标志,而不是L
,以防止重写引擎的“循环”和第二次传递。)注意,我只匹配
shop
URL参数的非空值。忽略空的shop
URL参数。第一个规则中的%1
反向引用包含前面的 CondPattern 中捕获的shop
URL参数的值。请注意,此值是URL编码的。请注意,
Header
指令中添加了env=SHOP_VALUE
参数,该参数根据是否设置SHOP_VALUE
env var来设置此头文件。(当shop
URL参数不存在且查询字符串中没有值时,不会设置该参数。)参见:
Content-Security-Policy
响应头允许您控制给定用户代理能够加载的资源。然而,如果你给用户代理直接控制这个头的值的能力,那么这个头提供的任何“安全性”都被有效地绕过了。这个正则表达式只检查查询字符串中任何地方的字符串“shop=”,包括
shop
可能作为另一个URL参数的一部分出现的地方,例如。fooshop=
.