摘要:解決一個歷史遺留問題博客上線后第一篇關于的博客就是綁定域名與反向代理是關于的代理設置,到現在為止線上幾個二級小站也還是在使用那個模塊,卻怎么也沒想到,這些小站的一個共同的遺留問題也源自這個代理模塊問題在于用已知的各種方式獲取到的訪問者的永
解決一個歷史遺留問題:
博客上線后第一篇關于Nodejs的博客就是——Nodejs綁定域名與反向代理;是關于Nodejs的代理設置,到現在為止線上幾個二級小站也還是在使用那個http-proxy模塊,卻怎么也沒想到,這些小站的一個共同的遺留問題也源自這個代理模塊;問題在于:用已知的各種方式獲取到的訪問者的ip永遠為127.0.0.1;拜托不要提os模塊了,os可以獲取本站ipv4的值,除此值以外,根本沒有第二個ipv4的字段好嘛!
比如以博客為主站,cdn為二級站點,代理模塊是這樣的,像下面這樣,問題就在其中:
var http = require("http"), httpProxy = require("http-proxy"), proxy = httpProxy.createProxyServer({}); proxy.on("error", function (err, req, res) { res.writeHead(500, { "Content-Type": "text/plain" }); res.end("Something went wrong."); }); var server = require("http").createServer(function(req, res) { var host = req.headers.host; switch (host){ case "cdn.famanoder.cn": proxy.web(req, res, { target: "http://localhost:4000" }); break; case "www.famanoder.cn": proxy.web(req, res, { target: "http://localhost:3000" }); break; default: proxy.web(req, res, { target: "http://localhost:3000" }); } }); server.listen(80);
這里是新建了一個server來監聽80端口,然后根據所有請求的host,將請求代理到目標站點;如果訪問首頁http://famanoder.com那么將會被代理到服務器上的3000端口的站點,也就是說,我只是自認為我訪問首頁就是直接訪問3000端口,而其實是通過一個額外的server代理過去的,所以我在所有站點里獲取到的ip永遠為127.0.0.1,因為代理過來后域從famanoder.com變為了localhost;
從上面的代理設置,可以看出兩個問題:
1、這里新建的一個server是多余的;
2、不能將所有站點包括在代理設置內;
2.5、抱歉,請原諒我這個不完美的小孩;
既然這個server是多余的,那么先將其去掉;
既然不能將所有站點包括在代理設置內,那么就留下博客做主站監聽80端口;
那么就應該在主站里分發二級站點了,事實也證明主站里監聽80端口后,通過express的req.ip就能獲取到訪問者的ip了,同上,二級站點現在是被代理轉發的,所以依然拿不到真實的訪問者的ip;
既然主站現在可以拿到ip,二級站點又是由主站分發出去的,那么在轉發之前通過設置轉發請求的header,二級站點從header上不就可以拿到從主站傳過來的ip了嗎!
在express里,現在可以將這個代理設置作為一個中間件來對待,將訪問者的ip由請求header帶過去:
app.use(function(req,res,next){ console.log(req.ip); var proxy = httpProxy.createProxyServer({ headers:{ "x-forward-ip":req.ip.match(/([w.]+)/g)[1] } }); proxy.on("error", function (err, req, res) { res.writeHead(500, { "Content-Type": "text/plain" }); res.end("Something went wrong."); }); var host = req.headers.host; switch (host){ case "cdn.famanoder.cn": proxy.web(req, res, { target: "http://localhost:4000" }); break; default: next();//主站不再被轉發,next()是必需的!!! } });
如上:添加了代理設置的headers項,二級站點將由req.header("x-forward-ip")來獲取訪問者的ip;
用http-proxy解決跨域問題:
如果a.com要請求b.com的接口,涉及到跨域問題,除了jsonp之外,通過http-proxy設置代理,可以直接請求a.com,然后由proxy將a.com轉發到b.com實現跨域;
case "a.com": proxy.web(req, res, { target: "http://b.com" }); break;
因為跨域問題只存在于前端,后端根本不涉及到跨域問題;現在感覺http-proxy是通過http.request來實現的轉發,可能就是切換host;
原文來自:花滿樓(http://famanoder.com/bokes)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81058.html
摘要:所有的都不是完整的程序,所有未上線的程序都僅僅是個作為開發的后起之秀,在現在的國內環境下,雖比不上的火熱,沒有那么廣大的群眾基礎,蓋不過的高大上,但基于谷歌引擎的極速,異步與事件模型,無疑將是開發的重大革新我是一個小前端,自從知道,就覬覦其 所有的Demo都不是完整的程序,所有未上線的程序都僅僅是個Demo; Nodejs作為Web開發的后起之秀,在現在的國內環境下,雖比不上PHP的火...
摘要:由于本次只是用來上手線上部署項目,直接使用超級管理員賬號進行登錄操作,一般情況下需要另創建一個用戶來登錄。然后在目錄下給文件授權,通過命令行回車,然后在輸入。遠程無密碼登錄服務器設置完成。安裝完成后輸入命令,有關于的相關信息即表示安裝成功。 1.購買一個港澳臺或國外服務器,購買一個域名本次使用的是美國服務器,10M帶寬,保證網絡傳輸速度,也方便從國外拉取資源到服務器中。域名是在阿里云上...
摘要:由于本次只是用來上手線上部署項目,直接使用超級管理員賬號進行登錄操作,一般情況下需要另創建一個用戶來登錄。然后在目錄下給文件授權,通過命令行回車,然后在輸入。遠程無密碼登錄服務器設置完成。安裝完成后輸入命令,有關于的相關信息即表示安裝成功。 1.購買一個港澳臺或國外服務器,購買一個域名本次使用的是美國服務器,10M帶寬,保證網絡傳輸速度,也方便從國外拉取資源到服務器中。域名是在阿里云上...
摘要:知乎日報代理首先感謝提供的分析使用詳情請參考他提供的參數和地址代理轉發的使用為前綴進入代理路由啟動界面圖像獲取后為圖像分辨率,接受任意的格式,為任意非負整數,返回值均相同返回值示例最新消息等具體參考提供的分析中的使用方式以及參數含義。 項目說明 這是一個基于express的node后端API服務,當時只是想抓取字幕組網站的下載資源,以備以后通過nas的方式去自動下載關注的美劇。不過后來...
閱讀 2250·2021-11-16 11:44
閱讀 644·2019-08-30 15:55
閱讀 3277·2019-08-30 15:52
閱讀 3614·2019-08-30 15:43
閱讀 2201·2019-08-30 11:21
閱讀 439·2019-08-29 12:18
閱讀 1951·2019-08-26 18:15
閱讀 473·2019-08-26 10:32