.htaccess 使用query_string数据设置Header-apache 2

cnh2zyt3  于 2023-05-01  发布在  Apache
关注(0)|答案(1)|浏览(138)

我正在运行Apache,并且仅当请求在查询字符串上有一个变量shop=X时,我才试图设置一个头Content-Security-Policy = X。我想在我的htaccess中这样的东西:

<If "%{QUERY_STRING} =~ /shop=.*?/">
    Header set Content-Security-Policy 'X'
</If>

当我设置Header时,如何获得查询的X值?

svmlkihl

svmlkihl1#

你可以使用mod_rewrite来根据查询字符串设置一个环境变量,并根据是否设置了这个env变量来有条件地设置header,同时在头值中使用这个env变量。(这里不能使用SetEnvIf,因为SetEnvIf无法访问URL的查询字符串部分。)
例如,以下设置并使用SHOP_VALUE env var:

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

根据上面的代码注解,您可能需要将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参数不存在且查询字符串中没有值时,不会设置该参数。)
参见:

  • Apache RewriteRule: bad flag delimiters "FilesMatch"
  • Aide/Warning:* Content-Security-Policy响应头允许您控制给定用户代理能够加载的资源。然而,如果你给用户代理直接控制这个头的值的能力,那么这个头提供的任何“安全性”都被有效地绕过了。
  • 旁白:*
<If "%{QUERY_STRING} =~ /shop=.*?/">

这个正则表达式只检查查询字符串中任何地方的字符串“shop=”,包括shop可能作为另一个URL参数的一部分出现的地方,例如。fooshop= .

相关问题