You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.Net 5应用经NGINX反向代理路由时出现415 Unsupported Media Type错误的求助

解决ASP.NET 5 + Nginx反向代理下POST请求415错误及HTTPS访问问题

我来帮你搞定这两个问题——POST请求返回415错误,以及Postman去掉https://就无法访问的问题,核心都出在Nginx的配置上,咱们一步步调整:

一、415 Unsupported Media Type错误的根源与修复

你的415错误本质是Nginx没把POST请求的Content-Type关键请求头转发给后端ASP.NET应用。ASP.NET的[FromBody]特性依赖正确的Content-Type(比如application/json)来解析请求体,一旦这个头丢失,后端就识别不了请求格式,直接返回415。

修改Nginx核心配置

在你的location /块里添加必要的请求头转发指令,确保后端能拿到完整的请求信息:

auth_basic "#MyAuth#";
auth_basic_user_file #MyAuthFile#;
server_name #MyServerName#;

# 先补全监听配置(同时解决HTTPS的问题)
listen 80;
listen 443 ssl;
# 替换成你的SSL证书路径(如果用HTTPS的话必须配置)
# ssl_certificate /path/to/your/ssl/cert.pem;
# ssl_certificate_key /path/to/your/ssl/privkey.pem;

location / {
    proxy_pass https://#MyServerIP:MyServerPort#/;
    
    # 转发客户端的真实请求信息给后端
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    # 关键!把客户端的Content-Type和Content-Length原封不动传给后端
    proxy_set_header Content-Type $http_content_type;
    proxy_set_header Content-Length $http_content_length;
    
    # 修复HTTP/1.1的连接复用问题,避免POST请求体处理异常
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}

location /static/ {
    root /#MyServerDestination#/;
}

重点配置解释

  • proxy_set_header Content-Type $http_content_type:这是解决415错误的核心,直接把客户端发送的Content-Type头转发给ASP.NET,让它知道该怎么解析请求体。
  • proxy_http_version 1.1 + proxy_set_header Connection "":避免HTTP/1.0的连接限制,防止POST请求的请求体被截断或解析失败。
  • X-Forwarded-Proto $scheme:让ASP.NET知道客户端是用HTTP还是HTTPS访问的,避免生成错误的回调地址或Cookie。

二、Postman去掉HTTPS无法访问的问题修复

你说去掉https://就请求失败,大概率是Nginx没配置80端口(HTTP)的监听,或者没把HTTP请求重定向到HTTPS。

推荐方案:强制HTTPS访问(生产环境必备)

如果想让所有请求都走HTTPS,可以单独加一个80端口的server块,把HTTP请求重定向到HTTPS:

# 处理HTTP请求,重定向到HTTPS
server {
    listen 80;
    server_name #MyServerName#;
    return 301 https://$server_name$request_uri;
}

# 原有的HTTPS server配置
server {
    auth_basic "#MyAuth#";
    auth_basic_user_file #MyAuthFile#;
    server_name #MyServerName#;
    listen 443 ssl;
    ssl_certificate /path/to/your/ssl/cert.pem;
    ssl_certificate_key /path/to/your/ssl/privkey.pem;

    location / {
        # 同上的proxy配置
    }

    location /static/ {
        root /#MyServerDestination#/;
    }
}

这样哪怕Postman输入HTTP地址,也会自动跳转到HTTPS,不会出现访问失败的情况。

备选方案:允许HTTP访问(不推荐生产环境)

如果确实需要HTTP访问,确保你的Nginx server块里有listen 80;,同时检查ASP.NET应用的Program.cs里有没有强制HTTPS的代码(比如app.UseHttpsRedirection()),如果有,要么注释掉,要么配置Nginx的X-Forwarded-Proto让ASP.NET识别HTTPS。

三、最后验证步骤

  1. Postman发送POST请求时,一定要确认Headers里的Content-Typeapplication/json,而且请求体是合法的JSON格式(虽然你说之前正常,但还是再检查下)。
  2. 修改Nginx配置后,执行nginx -s reload重新加载配置,别忘记这一步!
  3. 可以查看ASP.NET应用的日志,确认后端是否收到了正确的Content-Type头,方便进一步排查。

内容的提问来源于stack exchange,提问作者Johannes Hart

火山引擎 最新活动