Nginx使用参数压缩mime类型



我让Nginx反向代理我的服务,该服务通过OData协议工作。我正试图通过放置来为这些请求启用压缩

#...
gzip on;
gzip_types application/json;
#...
server {
#...
location /odata/ {
proxy_pass http://localhost:7700/odata/;
}
#...
}

在nginx.conf.中

有时我的服务返回

内容类型:application/json;charset=utf-8;odata.metadata=最小

和Nginx压缩它。

但有时我的服务会返回

内容类型:application/json;odata.metadata=最小;odata.streaming=true;charset=utf-8

并且Nginx不压缩这样的响应。

我应该怎么做才能使Nginx压缩这样的响应?

通过在我的应用程序中编写中间件解决了这个问题,该中间件更改了Content-Type标头并将其转换为application/json; charset=utf-8; odata.metadata=minimal; odata.streaming=true;

之后,Nginx可以将其识别为json内容类型并对其进行压缩

让我添加我的ASP.NET Core解决方案。

请注意,这些响应是分块的,因此Nginx参数gzip_min_length将不起作用,小响应也将变为gzipped,从而增加大小并降低性能。

/// <summary>
/// Middleware to reorder Content-Type parts for Nginx compression.
/// </summary>
public class FixODataMiddlewareForNginx
{
readonly RequestDelegate _next;
public FixODataMiddlewareForNginx(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
context.Response.OnStarting(() =>
{
var contentType = context.Response.GetTypedHeaders().ContentType;
if (contentType != null && 
contentType.Parameters.Count > 0 && 
!contentType.Charset.HasValue)
{
contentType.Parameters.Insert(0, new NameValueHeaderValue("charset", "utf-8"));
context.Response.Headers["Content-Type"] = contentType.ToString();
}
return Task.CompletedTask;
});
await _next.Invoke(context);
}
}

相关内容

最新更新