Apache2 ProxyPass将304状态修改为200并添加内容类型

Apache2 ProxyPass将304状态修改为200并添加内容类型,apache2,reverse-proxy,mod-proxy,proxypass,Apache2,Reverse Proxy,Mod Proxy,Proxypass,问题 我正在通过Apache2反向代理运行节点服务器() 对于某些请求,节点服务器在直接访问时返回304状态代码,其中没有内容类型。但是,当通过反向代理访问时,状态代码更改为200,并且内容类型添加了一个值text/html。添加Content-Type导致应用程序无法加载JS和CSS,因为X-Content-Type-Options:nosniff位于标题中 我真的不想更改节点服务器,因为它不是我的项目。我想用反向代理配置解决这个问题 如何配置Apache2ProxyPass转发原始304响应

问题

我正在通过Apache2反向代理运行节点服务器()

对于某些请求,节点服务器在直接访问时返回304状态代码,其中没有
内容类型。但是,当通过反向代理访问时,状态代码更改为200,并且
内容类型
添加了一个值
text/html
。添加
Content-Type
导致应用程序无法加载JS和CSS,因为
X-Content-Type-Options:nosniff
位于标题中

我真的不想更改节点服务器,因为它不是我的项目。我想用反向代理配置解决这个问题

如何配置Apache2
ProxyPass
转发原始304响应,或者至少不使用默认值填充缺少的
内容类型

以下是我的具体情况:

配置

# /etc/apache2/sites-enabled/xxxx.conf
...
<Location "/sqlpad">
  ProxyPass http://x.x.x.x:xxxx # IP address of Node server
  ProxyPassReverse http://x.x.x.x:xxxx # IP address of Node server
</Location>


# /etc/apache2/apache2.conf (comments removed)

ServerName xxxxx.com
DefaultRuntimeDir ${APACHE_RUN_DIR}
PidFile ${APACHE_PID_FILE}
Timeout 600
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>
<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
代理请求/响应:

Request Url: http://xxxx/sqlpad/static/js/main.266789c5.js
Request Method: Get
Status: 200 OK

Response Headers:

Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 496
Content-Type: text/html; charset=utf-8
Date: Wed, 13 Jun 2018 15:18:29 GMT
ETag: W/"320-Lp3a/E+wIigPW+CnI/Elyd7OYoA-gzip"
Keep-Alive: timeout=5, max=98
Referrer-Policy: same-origin
Server: Apache/2.4.33 (Ubuntu)
Strict-Transport-Security: max-age=15552000; includeSubDomains
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-XSS-Protection: 1; mode=block

Request Headers:

GET /sqlpad/static/js/main.266789c5.js HTTP/1.1
Host: xxxx
Connection: keep-alive
If-None-Match: W/"320-Lp3a/E+wIigPW+CnI/Elyd7OYoA-gzip"
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: */*
Referer: http://xxxx/sqlpad
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: __zlcmid=xxxx; PHPSESSID=xxxx

我正在Ubuntu 16.04.4上使用Apache/2.4.33

我仍在处理解决方案的其他部分,但您可以使用的解决方法如下

RequestHeader unset If-None-Match
考虑在mod_proxy中无法确定内容类型的情况下进行设置

此指令已被禁用。用于向后兼容 配置文件,可以使用值none指定,这意味着 没有默认的媒体类型。例如:


参考资料:

不幸的是,该解决方案不起作用。它确实去掉了头,但这并没有阻止反向代理将
text/html
内容类型添加到JS文件中。我将编辑此问题以删除解决方法。请共享完整的httpd.conf,隐藏服务器详细信息。@ABDmaverick:我已经发布了我的
apache2.conf
。虽然奖金已经过期,但我很高兴奖励50名代表一个正确的答案。在这些情况下发生的任何事情-包括启用可选mods/*。加载包括启用可选mods/*。conf?@TomAranda,请运行
socat-v tcp-l:3001,reuseaddr,fork tcp:127.0.0.1:3000
假设
3000
是您的nodejs端口。接下来将proxypass更改为
3001
而不是
3000
,现在您将能够看到apache向NodeJS发送了什么以及NodeJS回复了什么。请从此共享调试日志。我在我的
标记中添加了此日志,并且还添加了
RequestHeader unset(如果没有匹配的话)
,但它不起作用。此外,sqlpad遵循express的默认行为(用于服务网页的节点包)。304响应不应该具有
内容类型
,因此sqlpad做的是正确的。我很惊讶这个问题以前没有出现过。也许我遗漏了一些明显的东西。@TomAranda你是对的,304就是这样表现的。
RequestHeader unset If-None-Match
DefaultType None