Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core nginx托管套接字不';不允许http post_Nginx_Asp.net Core_Websocket - Fatal编程技术网

.net core nginx托管套接字不';不允许http post

.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;

我正在尝试创建一个具有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;
    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;