【问题标题】:Nginx compress mime types with parametersNginx 使用参数压缩 mime 类型
【发布时间】:2022-04-29 17:56:55
【问题描述】:

我有 Nginx 反向代理我的服务,它通过 OData 协议工作。我正在尝试通过放置

来为这些请求启用压缩
#...
gzip on;
gzip_types application/json;
#...
server {
   #...
   location /odata/ {
      proxy_pass http://localhost:7700/odata/;
   }
   #...
}

在 nginx.conf 中。

有时我的服务会返回

内容类型:应用程序/json;字符集=utf-8; odata.metadata=最小

Nginx 对其进行压缩。

但有时我的服务会返回

内容类型:应用程序/json; odata.metadata=最小; odata.streaming=真;字符集=utf-8

Nginx 不会压缩此类响应。

我应该怎么做才能启用 Nginx 压缩此类响应?

【问题讨论】:

    标签: nginx odata nginx-reverse-proxy


    【解决方案1】:

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

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

    【讨论】:

    • 可以分享一下中间件代码吗?
    • 谢谢你,我会试试这个,让你知道它是否适合我:)
    • 我遇到的问题与 contentType 标头中缺少字符集有关。添加 'charset=utf-8' 后,压缩现在可以工作了
    【解决方案2】:

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

    请注意,尽管这些响应是分块的,因此 Nginx 参数 gzip_min_length 将不起作用,并且小的响应将被压缩,同时增加大小并降低性能。

    /// <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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2016-05-06
      • 2016-09-13
      • 2014-03-14
      • 2015-11-01
      • 1970-01-01
      • 2023-04-10
      • 2016-01-05
      • 1970-01-01
      相关资源
      最近更新 更多