Nginx:WebSocket 通配符位置
Nginx: WebSocket wildcard location
我在 Go 服务前面使用了一个 nginx 实例。
- 我想将端口 80 上的任何内容重定向到 https。 [完成]
- /* 处的所有 (non-websocket) 个 https 请求应该转到 https://localhost:8443/* [完成]
- 所有在 /ws/* 的 websocket https 请求都应该转到 https://localhost:8443/ws/* [缺失]
我当前的配置:
ssl_certificate ...
ssl_certificate_key ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name www.mydomain.com mydomain.com;
add_header Strict-Transport-Security "max-age=31536000";
location /ws { <--- This only works for /ws but not /ws/app1
proxy_pass http://localhost:8443/ws;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / { <--- Catches anything, even without wildcard ?!
proxy_pass http://localhost:8443;
}
}
server {
listen 443 ssl;
server_name *.mydomain.com;
return 444;
}
为什么这是必要的?好吧,据我了解,您必须明确设置升级 headers,所以我猜您 必须 指定另一个位置。
理想情况下,我只使用一个位置,但随后 websocket 被阻止(因为升级 headers 永远无法进入 Go 服务...)
我不是 nginx 专家,所以请多多包涵 =)。
[编辑]
我现在开始工作了。我不确定它是否总是 set_header Upgrade/Connection,即使它不是 websocket 请求,但我的 Go 服务不提供 ****,所以它对我有用 =]
ssl_certificate ...
ssl_certificate_key ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name www.mydomain.com mydomain.com;
add_header Strict-Transport-Security "max-age=31536000";
location / { <--- Catches anything, even without wildcard ?!
proxy_pass http://localhost:8443;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server {
listen 443 ssl;
server_name *.mydomain.com;
return 444;
}
上的文章
您没有使用任何 location_match
,因此匹配是前缀匹配。
使用 ~
作为位置匹配修饰符,将其解释为正则表达式。
行 location /ws
应该匹配每个以 /ws
开头的查询。
我在 Go 服务前面使用了一个 nginx 实例。
- 我想将端口 80 上的任何内容重定向到 https。 [完成]
- /* 处的所有 (non-websocket) 个 https 请求应该转到 https://localhost:8443/* [完成]
- 所有在 /ws/* 的 websocket https 请求都应该转到 https://localhost:8443/ws/* [缺失]
我当前的配置:
ssl_certificate ...
ssl_certificate_key ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name www.mydomain.com mydomain.com;
add_header Strict-Transport-Security "max-age=31536000";
location /ws { <--- This only works for /ws but not /ws/app1
proxy_pass http://localhost:8443/ws;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / { <--- Catches anything, even without wildcard ?!
proxy_pass http://localhost:8443;
}
}
server {
listen 443 ssl;
server_name *.mydomain.com;
return 444;
}
为什么这是必要的?好吧,据我了解,您必须明确设置升级 headers,所以我猜您 必须 指定另一个位置。
理想情况下,我只使用一个位置,但随后 websocket 被阻止(因为升级 headers 永远无法进入 Go 服务...)
我不是 nginx 专家,所以请多多包涵 =)。
[编辑]
我现在开始工作了。我不确定它是否总是 set_header Upgrade/Connection,即使它不是 websocket 请求,但我的 Go 服务不提供 ****,所以它对我有用 =]
ssl_certificate ...
ssl_certificate_key ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name www.mydomain.com mydomain.com;
add_header Strict-Transport-Security "max-age=31536000";
location / { <--- Catches anything, even without wildcard ?!
proxy_pass http://localhost:8443;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server {
listen 443 ssl;
server_name *.mydomain.com;
return 444;
}
您没有使用任何 location_match
,因此匹配是前缀匹配。
使用 ~
作为位置匹配修饰符,将其解释为正则表达式。
行 location /ws
应该匹配每个以 /ws
开头的查询。