# 環境

在 docker compose 中,使用 nginx 導向 websocket 到 container 內

# 錯誤訊息

websocket 連接不上,查看 request headers 顯示 Provisional headers are shown

provisional headers are shown

# Solution

搜尋解決方法是在 nginx.conf 內加上

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# 範例

範例
location /backend/ {
    proxy_pass http://backend/;
    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-Custom-Referrer smc_identity_layer;
    # websocket 要加下面兩個
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

# 驗證

比較有修正前跟修正後,後端實際收到的 request header

# 修正前 request headers

修正前
Headers({'host': 'localhost',
 'x-real-ip': '192.168.224.1',
 'x-forwarded-for': '192.168.224.1',
 'x-custom-referrer': 'smc_identity_layer',
 'connection': 'close',
 'pragma': 'no-cache',
 'cache-control': 'no-cache',
 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
 'origin': 'chrome-extension://cbcbkhdmedgianpaifchdaddpnmgnknn',
 'sec-websocket-version': '13',
 'accept-encoding': 'gzip, deflate, br',
 'accept-language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
 'sec-websocket-key': 'iBVj1v1X8xkD324lsXZSUA==',
 'sec-websocket-extensions': 'permessage-deflate; client_max_window_bits'})

# 修正後 request headers

修正後
Headers({'host': 'localhost',
'x-real-ip': '192.168.208.1',
'x-forwarded-for': '192.168.208.1',
'x-custom-referrer': 'smc_identity_layer',
'upgrade': 'websocket',
'connection': 'upgrade',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
'origin': 'chrome-extension://cbcbkhdmedgianpaifchdaddpnmgnknn',
'sec-websocket-version': '13',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'sec-websocket-key': 'j2NwT86WmJt6rIyatTa5rw==',
'sec-websocket-extensions': 'permessage-deflate; client_max_window_bits'})