HTTP/2 的 Apache 反向代理将丢失 MIME 类型并使用默认值

Posted

技术标签:

【中文标题】HTTP/2 的 Apache 反向代理将丢失 MIME 类型并使用默认值【英文标题】:Apache reverse proxy by HTTP/2 will lost MIME-type and use default 【发布时间】:2019-09-26 08:08:19 【问题描述】:

英语不是我的母语,请原谅输入错误。

我按如下方式配置了 Apache 反向代理,它可以工作。

ProxyRequests Off
SSLEngine On
SSLProxyEngine On

ProxyPass / https://example.com/
ProxyPassReverse / https://example.com/

而且我的网站(php)支持HTTP/2,所以我想通过HTTP/2代理它。

我启用了mod_proxymod_proxy_httpmod_sslmod_http2mod_proxy_http2 和其他一些模块。并将.php MIME-type 设置为application/x-httpd-php

AddType application/x-httpd-php .php

VirtualHost 如下:

<VirtualHost *:443>
    DocumentRoot "/path/to/wwwroot/"
    ServerName localhost:443

    ProxyRequests Off
    SSLEngine On
    SSLProxyEngine On

    ProxyPass / h2://example.com/
    ProxyPassReverse / https://example.com/

    # Cert
    SSLCertificateFile ...
    SSLCertificateKeyFile ...
</VirtualHost>

不同的是 ProxyPass / https://example.com/ProxyPass / h2://example.com/

浏览器中的响应标头 Content-Type 始终获取默认 MIME 类型。

你可以在phpMyAdmin Demo找到例子,在DevTools中过滤whitelist.php,这个文件Content-Typetext/javascript

通过HTTP/2 代理它,Content-Type 变成application/x-httpd-php,它失去了源MIME类型text/javascript

并通过HTTP/1.1代理它,效果很好。

我该如何解决这个问题?

谢谢。

【问题讨论】:

【参考方案1】:

虚拟主机文件配置:

  <VirtualHost *:443>
    ServerAdmin admin@test.com
    ServerName example.com
    ServerAlias www.example.com

    ssl_certificate .....
    ssl_certificate_key ..........

  ProxyRequests Off Order deny, allow Allow from all
 <Location />
        ProxyPass http://example.com:8000/
        ProxyPassReverse http://example.com:8000/
    </Location>

</VirtualHost>

接下来我们需要启用一些 Apache 模块。为此,请发出以下命令:

sudo a2enmod 代理

sudo a2enmod proxy_http

sudo a2enmod proxy_balancer

sudo a2enmod lbmethod_byrequests

Apache 现在需要使用以下命令重新启动:

sudo 服务 apache2 重启

【讨论】:

以上是关于HTTP/2 的 Apache 反向代理将丢失 MIME 类型并使用默认值的主要内容,如果未能解决你的问题,请参考以下文章

Apache反向代理

nginx反向代理后丢失origin参数

apache与tomcat 反向代理

问题解决1:nginx反向代理丢失js、css问题

apache2.2 反向代理 配置css js静态文件

12.反向代理——Apache2