摘要:解決一個(gè)歷史遺留問(wèn)題博客上線后第一篇關(guān)于的博客就是綁定域名與反向代理是關(guān)于的代理設(shè)置,到現(xiàn)在為止線上幾個(gè)二級(jí)小站也還是在使用那個(gè)模塊,卻怎么也沒(méi)想到,這些小站的一個(gè)共同的遺留問(wèn)題也源自這個(gè)代理模塊問(wèn)題在于用已知的各種方式獲取到的訪問(wèn)者的永
解決一個(gè)歷史遺留問(wèn)題:
博客上線后第一篇關(guān)于Nodejs的博客就是——Nodejs綁定域名與反向代理;是關(guān)于Nodejs的代理設(shè)置,到現(xiàn)在為止線上幾個(gè)二級(jí)小站也還是在使用那個(gè)http-proxy模塊,卻怎么也沒(méi)想到,這些小站的一個(gè)共同的遺留問(wèn)題也源自這個(gè)代理模塊;問(wèn)題在于:用已知的各種方式獲取到的訪問(wèn)者的ip永遠(yuǎn)為127.0.0.1;拜托不要提os模塊了,os可以獲取本站ipv4的值,除此值以外,根本沒(méi)有第二個(gè)ipv4的字段好嘛!
比如以博客為主站,cdn為二級(jí)站點(diǎn),代理模塊是這樣的,像下面這樣,問(wèn)題就在其中:
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);
這里是新建了一個(gè)server來(lái)監(jiān)聽(tīng)80端口,然后根據(jù)所有請(qǐng)求的host,將請(qǐng)求代理到目標(biāo)站點(diǎn);如果訪問(wèn)首頁(yè)http://famanoder.com那么將會(huì)被代理到服務(wù)器上的3000端口的站點(diǎn),也就是說(shuō),我只是自認(rèn)為我訪問(wèn)首頁(yè)就是直接訪問(wèn)3000端口,而其實(shí)是通過(guò)一個(gè)額外的server代理過(guò)去的,所以我在所有站點(diǎn)里獲取到的ip永遠(yuǎn)為127.0.0.1,因?yàn)榇磉^(guò)來(lái)后域從famanoder.com變?yōu)榱薼ocalhost;
從上面的代理設(shè)置,可以看出兩個(gè)問(wèn)題:
1、這里新建的一個(gè)server是多余的;
2、不能將所有站點(diǎn)包括在代理設(shè)置內(nèi);
2.5、抱歉,請(qǐng)?jiān)徫疫@個(gè)不完美的小孩;
既然這個(gè)server是多余的,那么先將其去掉;
既然不能將所有站點(diǎn)包括在代理設(shè)置內(nèi),那么就留下博客做主站監(jiān)聽(tīng)80端口;
那么就應(yīng)該在主站里分發(fā)二級(jí)站點(diǎn)了,事實(shí)也證明主站里監(jiān)聽(tīng)80端口后,通過(guò)express的req.ip就能獲取到訪問(wèn)者的ip了,同上,二級(jí)站點(diǎn)現(xiàn)在是被代理轉(zhuǎn)發(fā)的,所以依然拿不到真實(shí)的訪問(wèn)者的ip;
既然主站現(xiàn)在可以拿到ip,二級(jí)站點(diǎn)又是由主站分發(fā)出去的,那么在轉(zhuǎn)發(fā)之前通過(guò)設(shè)置轉(zhuǎn)發(fā)請(qǐng)求的header,二級(jí)站點(diǎn)從header上不就可以拿到從主站傳過(guò)來(lái)的ip了嗎!
在express里,現(xiàn)在可以將這個(gè)代理設(shè)置作為一個(gè)中間件來(lái)對(duì)待,將訪問(wèn)者的ip由請(qǐng)求header帶過(guò)去:
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();//主站不再被轉(zhuǎn)發(fā),next()是必需的?。?! } });
如上:添加了代理設(shè)置的headers項(xiàng),二級(jí)站點(diǎn)將由req.header("x-forward-ip")來(lái)獲取訪問(wèn)者的ip;
用http-proxy解決跨域問(wèn)題:
如果a.com要請(qǐng)求b.com的接口,涉及到跨域問(wèn)題,除了jsonp之外,通過(guò)http-proxy設(shè)置代理,可以直接請(qǐng)求a.com,然后由proxy將a.com轉(zhuǎn)發(fā)到b.com實(shí)現(xiàn)跨域;
case "a.com": proxy.web(req, res, { target: "http://b.com" }); break;
因?yàn)榭缬騿?wèn)題只存在于前端,后端根本不涉及到跨域問(wèn)題;現(xiàn)在感覺(jué)http-proxy是通過(guò)http.request來(lái)實(shí)現(xiàn)的轉(zhuǎn)發(fā),可能就是切換host;
原文來(lái)自:花滿樓(http://famanoder.com/bokes)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81058.html
摘要:所有的都不是完整的程序,所有未上線的程序都僅僅是個(gè)作為開(kāi)發(fā)的后起之秀,在現(xiàn)在的國(guó)內(nèi)環(huán)境下,雖比不上的火熱,沒(méi)有那么廣大的群眾基礎(chǔ),蓋不過(guò)的高大上,但基于谷歌引擎的極速,異步與事件模型,無(wú)疑將是開(kāi)發(fā)的重大革新我是一個(gè)小前端,自從知道,就覬覦其 所有的Demo都不是完整的程序,所有未上線的程序都僅僅是個(gè)Demo; Nodejs作為Web開(kāi)發(fā)的后起之秀,在現(xiàn)在的國(guó)內(nèi)環(huán)境下,雖比不上PHP的火...
摘要:由于本次只是用來(lái)上手線上部署項(xiàng)目,直接使用超級(jí)管理員賬號(hào)進(jìn)行登錄操作,一般情況下需要另創(chuàng)建一個(gè)用戶來(lái)登錄。然后在目錄下給文件授權(quán),通過(guò)命令行回車,然后在輸入。遠(yuǎn)程無(wú)密碼登錄服務(wù)器設(shè)置完成。安裝完成后輸入命令,有關(guān)于的相關(guān)信息即表示安裝成功。 1.購(gòu)買一個(gè)港澳臺(tái)或國(guó)外服務(wù)器,購(gòu)買一個(gè)域名本次使用的是美國(guó)服務(wù)器,10M帶寬,保證網(wǎng)絡(luò)傳輸速度,也方便從國(guó)外拉取資源到服務(wù)器中。域名是在阿里云上...
摘要:由于本次只是用來(lái)上手線上部署項(xiàng)目,直接使用超級(jí)管理員賬號(hào)進(jìn)行登錄操作,一般情況下需要另創(chuàng)建一個(gè)用戶來(lái)登錄。然后在目錄下給文件授權(quán),通過(guò)命令行回車,然后在輸入。遠(yuǎn)程無(wú)密碼登錄服務(wù)器設(shè)置完成。安裝完成后輸入命令,有關(guān)于的相關(guān)信息即表示安裝成功。 1.購(gòu)買一個(gè)港澳臺(tái)或國(guó)外服務(wù)器,購(gòu)買一個(gè)域名本次使用的是美國(guó)服務(wù)器,10M帶寬,保證網(wǎng)絡(luò)傳輸速度,也方便從國(guó)外拉取資源到服務(wù)器中。域名是在阿里云上...
摘要:知乎日?qǐng)?bào)代理首先感謝提供的分析使用詳情請(qǐng)參考他提供的參數(shù)和地址代理轉(zhuǎn)發(fā)的使用為前綴進(jìn)入代理路由啟動(dòng)界面圖像獲取后為圖像分辨率,接受任意的格式,為任意非負(fù)整數(shù),返回值均相同返回值示例最新消息等具體參考提供的分析中的使用方式以及參數(shù)含義。 項(xiàng)目說(shuō)明 這是一個(gè)基于express的node后端API服務(wù),當(dāng)時(shí)只是想抓取字幕組網(wǎng)站的下載資源,以備以后通過(guò)nas的方式去自動(dòng)下載關(guān)注的美劇。不過(guò)后來(lái)...
閱讀 2323·2021-11-16 11:44
閱讀 668·2019-08-30 15:55
閱讀 3303·2019-08-30 15:52
閱讀 3646·2019-08-30 15:43
閱讀 2226·2019-08-30 11:21
閱讀 463·2019-08-29 12:18
閱讀 1985·2019-08-26 18:15
閱讀 502·2019-08-26 10:32