H2o: 无法使用 .php 在主机和路径级别添加标头

创建于 2017-05-15  ·  15评论  ·  资料来源: h2o/h2o

在 FreeBSD 下看到一个奇怪的 H2O 2.2.2 行为。 如果站点使用 PHP 文件作为索引,则不可能在主机级别添加标头。 在其他情况下,当站点使用 index.html 时,一切正常。 PHP 处理通过 file.custom-handler

...
file.custom 处理程序:
扩展名:“.php”
fastcgi.connect:
主机:127.0.0.1
端口:9000
类型:tcp
...

这里有两个站点。 首先不要使用 PHP 索引,其次才是。

第一:443 ”:
header.add:“严格传输安全:max-age=15768000;includeSubDomains;预加载”
听:
端口:443
ssl:
证书文件:/usr/local/etc/letsencrypt/live/first/fullchain.pem
密钥文件:/usr/local/etc/letsencrypt/live/first/privkey.pem
路径:
“/”:
文件目录:/usr/local/www/first
第二:443 ”:
header.add:“严格传输安全:max-age=15768000;includeSubDomains;预加载”
听:
端口:443
ssl:
证书文件:/usr/local/etc/letsencrypt/live/second/fullchain.pem
密钥文件:/usr/local/etc/letsencrypt/live/second/privkey.pem
路径:
“/”:
文件目录:/usr/local/www/second

答案:

--- 卷曲 -I https://first
HTTP/2 200
服务器:h2o/2.2.2
日期:2017 年 5 月 14 日星期日 22:39:37 GMT
内容类型:文本/html
最后修改时间:2016 年 7 月 11 日星期一 17:55:34 GMT
etag:“5783dd96-38bd”
变化:接受编码
接受范围:字节
严格的传输安全:最大年龄=15768000; 包括子域; 预载
内容长度:14525
--- 卷曲 -I https://second
HTTP/2 200
服务器:h2o/2.2.2
日期:2017 年 5 月 14 日星期日 22:39:14 GMT
x-供电:PHP/5.6.30
设置cookie:second_sessid=ea46d7ad1cb3766feb70e741efb59e9b; 路径=/; 安全的; HttpOnly
过期时间:2017 年 5 月 14 日星期日 22:39:14 GMT
最后修改时间:2017 年 5 月 14 日星期日 22:39:14 GMT
缓存控制:私有,无缓存,无存储,必须重新验证,后检查 = 0,预检查 = 0
杂注:无缓存
x-dns-prefetch-控制:关闭
x-frame-options:同源
内容语言:en
内容类型:文本/html; 字符集=UTF-8

最有用的评论

我发现 header.add (和可能的 header.set)也不适用于 .php 的路径级别。

所有15条评论

+1

如果您使用header.set而不是header.add ,您能否检查是否也会发生这种情况?

我刚刚对其进行了测试,可以确认@xm74的问题。

header.add更改为header.set对我的测试服务器没有任何影响(FreeBSD 11.0-RELEASE 上的 h2o/2.2.2)。

不过, header.addheader.set都在全局和路径级别上工作。 只是不在主机级别。

感谢您的意见! 希望它会尽快修复。

我还发现 X-Frame-Options: 标头是在 H2O 处理 PHP 文件时设置的。 为什么和谁这样做?

在我的测试实例中, X-Frame-Option 标头不存在。 我猜你已经在 h2o.conf 的其他地方(例如全局)配置了它,或者它来自 PHP 应用程序并且只由 h2o 传递。

谢谢,@utrenkner。 我刚刚发现这个标头来自 Roundcube 安装,我用于“第二个”示例站点的错误演示。 这不是 H2O 问题。

我发现 header.add (和可能的 header.set)也不适用于 .php 的路径级别。

同样在这里。 我用 curl -IL 进行了检查,它通过以下 302 重定向神秘地发送了标头:

http://domain.ext -> https://domain.ext(302 上的标头)-> https://www.domain.ext (200 上没有标头)

http://www.domain.ext -> https://www.domain.ext (200 上没有标题)

https://domain.ext ->(302 上的标题)-> https://www.domain.ext (200 上没有标题)

https://www.domain.ext (200 上没有标题)

我已经在 2.2.1、2.2.2 和 2.3.0-DEV 上进行了测试。 结果相同。

我可以确认@xm74 :对于静态文件,我有典型的 filedir 组合,并为动态内容重定向到 /index.php/ 。 路径中的header.add不适用于 PHP 部分,仅适用于静态资产。

不幸的是,我没有看到这个问题的任何进展,所以我编写了简单的模块addheaders.rb ,它从 H2O 格式文件中提取标题并将它们添加到输出中。

# addheaders.rb - Processing headers from file
class Addheaders

    attr_accessor :path

    def initialize(path)
        <strong i="7">@path</strong> = path
    end

    def call(env)
        headers = {}
        File.open(@path) do |file|
            file.each_line do |line|
                name, value = line.chomp[/^header.*: "(.*)"$/, 1].split(': ', 2)
                headers[name] = value.gsub('\"', '"')
            end
        end
        return [399, headers, []]
    end

end

_headers.file_ 可以包含这样的内容

header.add: "X-Content-Type-Options: nosniff"
header.add: "X-XSS-Protection: 1; mode=block"
header.add: "X-Frame-Options: DENY"
header.add: "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload"
header.add: "Public-Key-Pins: pin-sha256=\"B+Ty8+XerpRodPy44LG4pDGDLnm9Xf134IZoeQodq3Q=\"; pin-sha256=\"/77b5qXyAz84Mqd804mNZyA+qs+ebKc5xiF4sV/K5uM=\"; max-age=3456000; includeSubDomains"

在 main _h2o.conf_ 中,它以路径级别的标准方式调用:

        paths:
            "/":
                mruby.handler: |
                    require "/path/to/addheaders.rb"
                    Addheaders.new("/path/to/headers.file")
                    file.dir: /path/to/webdocs
            ...

希望这个 hack 会在一段时间内有用。

我可以确认这个问题仍然存在。 header.add仅在全局设置时有效。 主机和路径级别不起作用。

从最初的帖子过去了大约一年,但问题仍然存在,没有任何动静。

2.3有机会打补丁吗?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

utrenkner picture utrenkner  ·  8评论

kazuho picture kazuho  ·  7评论

utrenkner picture utrenkner  ·  5评论

proyb6 picture proyb6  ·  5评论

utrenkner picture utrenkner  ·  3评论