当前位置: 首页 > 知识库问答 >
问题:

如何说服Zend Framework发送重复的头文件?

秦才
2023-03-14

使用Content-Security-策略报头时,通常需要发送多个这样的报头,或者在发送这些报头之前合并这些报头。这是因为应用程序的每个模块/包都可以定义自己的CSP。

目前,ZF3似乎没有办法处理这种情况。如果我尝试添加多个CSP头,它们会不断相互覆盖,以便只发送最后添加的头。

$headers = $controller->getResponse()->getHeaders();
$headers->addHeader(new ContentSecurityPolicy($someDirectives));
$headers->addHeader(new ContentSecurityPolicy($someOtherDirectives));

预期的结果是具有两个CSP标头的响应(或联合合并的CSP)。

第二个加法覆盖了第一个,响应只包含那个CSP。

如何让ZF3发送具有相同字段名的多报头?

有关此问题的更多信息,请参阅我自己在github上的问题https://github.com/zendframework/zend-http/issues/159

共有3个答案

长孙正卿
2023-03-14

创建自己的multipleheader类,添加所需的函数(MultipleHeaderInterface),然后在multistring中添加标头,最后在

$headers = $controller->getResponse()->getHeaders();

(使用new fromStringHeaders调用新函数)

李成礼
2023-03-14

这是公认的HTTP标准,PHP核心支持这一点。http://php.net/manual/en/function.header.php

如果您在PHPheader(“TESTHeader:Test1”)中设置了头;标题(“TESTHeader:Test2”)只有一个会通过,这符合规范RFC2616第31页第4.2节的要求

如果您希望发送多个值,您的头应该构造为头(“TESTHeader:Test1,Test2”) 。虽然可以通过PHP发送多个同名标题,但不建议将其用作浏览器

所以这个答案是为什么你不允许在ZF3中多次发送相同的标题的原因,它不能根据你设置的标题来确定何时使用覆盖或不使用可以用吉姆的答案

越俊艾
2023-03-14

您应该能够使用GenericMultipleHeader作为引用(并将逗号分隔符更改为分号)创建一个简单的解决方案

class MultiContentSecurityPolicy extends ContentSecurityPolicy implements MultipleHeaderInterface {

    public static function fromString($headerLine)
    {
        list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($headerLine);
        if (strpos($fieldValue, ';')) {
            $headers = [];
            foreach (explode(';', $fieldValue) as $multiValue) {
                $headers[] = new static($fieldName, $multiValue);
            }
            return $headers;
        } else {
            $header = new static($fieldName, $fieldValue);
            return $header;
        }
    }

    public function toStringMultipleHeaders(array $headers)
    {
        $name  = $this->getFieldName();
        $values = [$this->getFieldValue()];
        foreach ($headers as $header) {
            if (! $header instanceof static) {
                throw new Exception\InvalidArgumentException(
                    'This method toStringMultipleHeaders was expecting an array of headers of the same type'
                );
            }
            $values[] = $header->getFieldValue();
        }
        return $name . ': ' . implode(';', $values) . "\r\n";
    }

}

然后使用该类而不是ContentSecurity策略

$headers = $controller->getResponse()->getHeaders();
$headers->addHeader(new MultiContentSecurityPolicy($someDirectives));
$headers->addHeader(new MultiContentSecurityPolicy($someOtherDirectives));

因为Zend检查接口而不是类,所以应该可以正常工作。

 类似资料:
  • 问题内容: 运行脚本时,出现如下错误: 警告:不能更改头信息-已经(发送了头输出在/some/file.php:12开始)在/some/file.php上线23 错误消息中提到的行包含和调用。 这可能是什么原因?以及如何解决? 问题答案: 发送头之前无输出! 在进行任何输出之前,必须调用发送/修改HTTP标头的函数。 否则,调用将失败: 警告:无法修改标头信息-标头已发送(输出从script:li

  • 可能重复: 如何从我的Android应用程序发送电子邮件? 我正在创建一个main。xml 如何在android中发送电子邮件。但必须是固定id(例如:myid@example.com) 我有main。xml

  • 我有一些c文件和.h头文件。现在我必须从这个.c和.h文件中创建.so文件。我怎么做?

  • 我需要发送如下内容: 我该怎么做?如果我尝试使用此代码,它将不起作用: 我认为我应该创建一个,但我不知道如何做到这一点。

  • 问题内容: 我在寻找有关如何 从localhost WAMP发送电子邮件的 适当信息。以及如何获得从特定的授权电子邮件地址发送电子邮件的授权以发送任何其他电子邮件地址。 如何配置这整个步骤向我解释了细节,我已经在这里访问了一些Stack Overflow的答案以及博客文章,但是所有内容都很混乱且过时,因此可能无法正常工作。所以我需要Stack Overflow用户帮助。谢谢。 问题答案: 从配置工

  • 如何通过Axios.js发送带有令牌的身份验证头?我试过几件事都没有成功,比如: 给出以下错误: