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

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

问题

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

某些请求,直接访问 Node 服务器会返回 304 状态码,且不带 Content-Type。但通过反向代理访问时,状态码会变为 200,并添加 Content-Type,值为 text/html。添加 Content-Type 会导致应用无法加载 JS 和 CSS,因为 Header 中有 X-Content-Type-Options: nosniff。

我真的不想对节点服务器进行更改,因为这不是我的项目。我想通过反向代理配置来解决这个问题。

我如何配置 Apache2 ProxyPass 来转发原始 304 响应,或者至少不要用默认值填写缺少的 Content-Type?

以下是我的具体情况:

配置

# /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>

标头

原始请求/响应(无代理):

Request Url: http://xxxx/sqlpad/static/js/main.266789c5.js
Request Method: Get
Status: 304 Not Modified

Response Headers:

HTTP/1.1 304 Not Modified
X-DNS-Prefetch-Control: off
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Referrer-Policy: same-origin
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Sat, 26 Oct 1985 08:15:00 GMT
ETag: W/"1d86fc-7438674ba0"
Date: Wed, 13 Jun 2018 15:04:20 GMT
Connection: keep-alive

Request Headers:

GET /sqlpad/static/js/main.266789c5.js HTTP/1.1
Host: xxxx
Connection: keep-alive
If-None-Match: W/"1d86fc-7438674ba0"
If-Modified-Since: Sat, 26 Oct 1985 08:15:00 GMT
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://localhost:56173/sqlpad/signin
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

代理请求/响应:

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

答案1

如果响应状态为 304(未修改),则不会向 HTTP 客户端发送任何内容。而是使用客户端缓存中的内容。因此不存在更改其内容类型的问题。Apache HTTPD 服务器会转发来自原始服务器的 304 响应,因为它具有默认配置。我在 Apache HTTP 代理后面有一些 nodejs 应用程序,我使用代理和直接应用程序访问计算了每次页面刷新的 200 和 304 响应数。它们是相同的。所以我强烈怀疑您面临的问题背后的原因不是响应代码,而是其他原因。

相关内容