.net core nginx托管套接字不';不允许http post
我正在尝试创建一个具有http功能的网站,包括http post功能和web套接字(如signalR)。我正在尝试使用nginx在ubuntu服务器上托管这个网站。一般来说,nginx上的设置如下所示:.net core nginx托管套接字不';不允许http post,nginx,asp.net-core,websocket,Nginx,Asp.net Core,Websocket,我正在尝试创建一个具有http功能的网站,包括http post功能和web套接字(如signalR)。我正在尝试使用nginx在ubuntu服务器上托管这个网站。一般来说,nginx上的设置如下所示: server { listen 80; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade;
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
}
}
然而,我后来发现我需要添加
proxy\u set\u头连接“升级”代码>以使用WebSocket。但是,在.net核心项目中添加这一行会导致所有http post请求显示400错误,如下所示。是否有允许POST和web套接字的设置 这不是解决您的问题的方法,但可能是一种变通方法。我通过在nginx中为单个asp.net核心kestrel站点设置两个代理位置来解决这个问题。一个用于带有
proxy_cache_bypass $http_upgrade;
其他的都是一个。看起来像这样。上一个用于除WebSocket以外的所有对象,下一个用于WebSocket。注意,我也重写了
location /n/ {
proxy_pass http://localhost:5001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
}
location /nsock/ {
proxy_pass http://localhost:5001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
使用$http_连接而不是保持活动状态或升级
proxy_set_header Connection $http_connection;
以下是我使用nginx对.Net核心API的配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
主要思想是删除这些行(如果有)
并在配置中插入这一行
proxy_set_header Connection $http_connection;
希望有帮助。为什么要重写每个请求?使用顶级配置,它基本上会在代理asp.net核心站点时从URL中删除“n/”。例如,此URL被代理为5001端口。注意,没有“n/”。我这样做是因为有几个kestrel实例运行在不同的端口上,我从常规80/443 nginx端口中的不同“子web文件夹”代理它们。不需要重写,这会导致nginx重新处理请求。您只需将代理通行证更改为proxy\u通行证即可http://localhost:5001/;代码>,第二个方向相同谢谢!我不知道在proxy_pass上尾随斜杠会这样工作。完全按照你说的进行,没有重写。这是在Pi上运行的,所以它感谢您没有在nginx中两次处理每个请求。我在上面编辑了我的代码片段,以防有人无意中发现。它的工作原理如下:proxy\u pass
到一个裸url,也就是说,在domain/ip/port和完整的客户端请求url传递到代理之后,什么都没有。添加任何内容,即使只是在proxy\u pass
中添加一个斜杠,您添加的任何内容都将替换与该位置块匹配的客户端请求url部分。所以如果你有location/foo{proxy_passhttp://example.com/bar
那么客户对example.com/foo/baz
的请求将被代理到example.com/bar/baz
完美!它可以工作!您能简单解释一下这个更改的作用吗?这对我来说部分有效。Websocket可以工作,POST请求可以工作,但现在我遇到了一个新问题,logg之后是什么如果使用Identity Server对其进行初始化,它会将我重定向到回调页面,而不带任何参数。
proxy_set_header Connection $http_connection;