上一篇文章有教學,使用Nginx反向代理內部的其他服務。我的WordPress也是在內部,由Nginx反向代理,以便能用一個的固定IP處理多個網站。但遇到一個問題是,Nginx反向代理到內部的WordPress時,會不斷的重新導向到自己的網站,造成重新導向迴圈迴圈。要直接看結果可以跳到文末完美解決版

出問題的設定

原本讓Nginx反向代理Spring Application的設定檔直接拿來使用會發生問題,先來看看原本的設定檔內容。

server {
  listen 80;
  server_name klab.tw;

  location / {
    proxy_pass http://localhost:8080;
    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 $http_x_forwarded_proto;
  }
}

解決重新導向迴圈

# 上略...
  location / {
    proxy_set_header Host $http_host;  # 增加這一行
  }

會發生不斷重新導向的原因,是因為WordPress會從HTTP Header判斷瀏覽器呼叫的網站,但是透過Nginx反向代理後在內部的網站的Host name會變成localhost或是內部IP。因此WordPress會誤判瀏覽器要觀看的網站是 http://localhost,所以要求瀏覽器轉址到 https://klab.tw,變成不斷地重新導向。

增加上面那行之後,Nginx會將正確的Host name提供給WordPress,就不會發生無限重新導向迴圈了。

解決WordPress誤判沒https

# 上略...
  location / {
    proxy_set_header X-Forwarded-Proto $scheme;  # 增加這一行
    proxy_headers_hash_bucket_size 128;          # 補充設定,原本預設值是64
  }

解決誤判Host name之後,使用https的網站會發生誤判協定的問題。理由也跟上面一樣,https://blog.funday.today 在內部是 http://localhost,會讓WordPress以為現在使用的是http。增加X-Forwarded-Proto之後就可以告訴WordPress瀏覽器真正使用的是https。

另外可能是指定的Header變多了,原本proxy_headers_hash_bucket_size的預設值是64,使用sudo nginx -t檢查設定時會報錯,將設定改成128就沒問題囉。相關說明與設定可參考這裡

完美解決版

server {
  listen 80;
  server_name klab.tw;

  location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $http_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;
    proxy_headers_hash_bucket_size 128;
  }
}
sudo nginx -t                # 先確定設定沒問題
sudo systemctl reload nginx  # 讓設定生效

這邊範例是http與80 port,需要https時也是比照此設定加上443與ssl憑證就可以囉。

參考連結