反向代理後 req.headers.host 的問題
发布于 3年前 作者 byvoid 1693 次浏览

一個用 express 寫的網站,本地運行,監聽 4000 端口。在本地的 Apache 服務器上配置了反向代理:

<VirtualHost *:80>
    ServerName mysite.com
    ProxyRequests off
    ProxyPass / http://localhost:4000/
    ProxyPassReverse / http://localhost:4000/
</VirtualHost>

這樣訪問 mysite.com 就可以定向到 express 的網站了。

我遇到了一個這樣的問題,express寫的網站中訪問了 req.headers.host 獲取用戶訪問的域名,我期望獲取到的值是 mysite.com ,但獲得的值卻是 localhost:4000 。這個問題如何解決呢?本機的80端口被apache佔用了,因爲還有 PHP 寫的網站也要運行。

我的目的是獲得用戶訪問本站的地址,有沒有別的什麼方法知道?

4 回复

Apache (以及 nginx) 在转发请求的时候会在 header 中加上一个 X-Forwarded-Host 字段用于表明原始请求的地址。

于是,在你的 node 应用中,可以使用 req.headers['X-Forwarded-Host'] 或者 req.header('X-Forwarded-Host')来获取它。

X-Forwarded-Host 是標準的嗎?如果我這麼做了豈不是要與apache或nginx耦合?

@byvoid X-Forwarded 系列现在仍然处于起草阶段(可以参见 IETF 上的草案 ),但是它其实已经是事实上的标准了,几乎所有主流的web服务器都支持它。

@xqunix 既然這樣我就先測試X-Forwarded-Host是否存在,如果沒有再讀取 host

回到顶部