nginx內(nèi)部訪問(wèn)特性如何實(shí)現(xiàn)靜態(tài)資源授權(quán)訪問(wèn)
nginx內(nèi)部訪問(wèn)特性實(shí)現(xiàn)靜態(tài)資源授權(quán)訪問(wèn)
在nginx中,將靜態(tài)資源設(shè)為internal;然后將前端的靜態(tài)資源地址改為指向后端,在后端的響應(yīng)頭部中寫上靜態(tài)資源地址。
近期客戶對(duì)我們項(xiàng)目做安全性測(cè)評(píng),暴露出一些安全性問(wèn)題,其中一個(gè)是有些靜態(tài)頁(yè)面(*.html)無(wú)須授權(quán)即可直接訪問(wèn),里面的信息一覽無(wú)遺,不安全。
這些靜態(tài)頁(yè)面都是arcgis地圖頁(yè)面,依賴arcgis for js,沒(méi)有辦法做成一般意義上的動(dòng)態(tài)頁(yè)面。或者說(shuō),該項(xiàng)目是個(gè)老項(xiàng)目,目前只處于維護(hù)階段,大規(guī)模改頭換面不現(xiàn)實(shí)。
怎么辦,有沒(méi)有什么方法,不改這些靜態(tài)頁(yè)面,或者是不做大的調(diào)整,就能實(shí)現(xiàn)只有登錄后才能訪問(wèn)它們呢?
看到網(wǎng)上有文章介紹,可以利用nginx的internal特性,將靜態(tài)資源設(shè)為內(nèi)部訪問(wèn),即可實(shí)現(xiàn)需要鑒權(quán)才能訪問(wèn)。
原理說(shuō)起來(lái)也比較簡(jiǎn)單。所謂內(nèi)部訪問(wèn),是指你直接在瀏覽器輸入靜態(tài)資源地址,將無(wú)法訪問(wèn),會(huì)直接報(bào)404,只有通過(guò)后端向nginx發(fā)送特定信息才可以。而后端,我們是要登錄系統(tǒng)以后才能請(qǐng)求的,所以就能實(shí)現(xiàn)我們想要的效果了。
具體來(lái)說(shuō)就是:
假設(shè)我們前端部署在nginx,原本我們要訪問(wèn)某個(gè)靜態(tài)頁(yè)面:/A.html
,現(xiàn)在不行了,要將地址改為 /api/static/getA,改而向后端請(qǐng)求;后端收到請(qǐng)求后,在響應(yīng)信息頭里加上一句:
response.setHeader("X-Accel-Redirect", "/A.html");
返回;nginx接收到響應(yīng)信息后,于是將/A.html
最終返回。
現(xiàn)在來(lái)真的,我們要實(shí)現(xiàn)/projects/dzzhyj/index.html的鑒權(quán)訪問(wèn)。
實(shí)現(xiàn)步驟
一、配置nginx
server { listen 8001; server_name 192.168.0.218; 。。。 location /projects/dzzhyj/ { alias /home/gzdd_html/gzdd/projects/dzzhyj/;#物理路徑 location ~* \.html$ {#只設(shè)置*.html為內(nèi)部訪問(wèn) internal; } } }
二、修改前端代碼
<template> <div class="-map-container"> <!-- <iframe src="/projects/dzzhyj/index.html" ></iframe> --> <iframe src="/api/dzzhyj/redirect/dzzhyj" ></iframe> </div> </template>
三、增加后端代碼
@Controller @RequestMapping("redirect") public class RedirectController { @GetMapping("/dzzhyj") public void handleDzzhyj(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setHeader("X-Accel-Redirect", "/projects/dzzhyj/index.html"); } }
四、運(yùn)行結(jié)果
直接訪問(wèn)靜態(tài)頁(yè)面,不行
通過(guò)后端地址可以
但后端必須登錄才行
完美。
說(shuō)下總結(jié)
這功能在nginx下才能使用。
其他web服務(wù)器有沒(méi)有類似機(jī)制不得而知。
但我們平時(shí)開發(fā),用vue,都直接用npm來(lái)跑,所以后端代碼做點(diǎn)更改,判斷是nginx發(fā)出的請(qǐng)求,才做上述處理,否則跳轉(zhuǎn):
@Controller @RequestMapping("redirect") public class RedirectController { @GetMapping("/dzzhyj") public void handleDzzhyj(HttpServletRequest request, HttpServletResponse response) throws Exception { String xForwardedForHeader = request.getHeader("X-Real-IP"); if (xForwardedForHeader != null && !xForwardedForHeader.isEmpty()) { // 請(qǐng)求經(jīng)過(guò)了 Nginx response.setHeader("X-Accel-Redirect", "/projects/dzzhyj/index.html"); } else { // 請(qǐng)求未經(jīng)過(guò) Nginx String[] hosts = request.getHeader("X-Forwarded-Host").split(","); String url = String.format("http://%s/projects/dzzhyj/index.html",hosts[0]); response.sendRedirect(url); } } }
其實(shí)沒(méi)有方法能直接判斷請(qǐng)求是否來(lái)自nginx,我是比較了從node發(fā)出的請(qǐng)求和從nginx發(fā)出的請(qǐng)求所包含的鍵值,看其中有沒(méi)有包含“X-Real-IP”,簡(jiǎn)單地做了一下判斷,不一定對(duì)。
1)vue運(yùn)行時(shí)的請(qǐng)求request結(jié)構(gòu)
2)nginx的request
補(bǔ)充:
- 我發(fā)現(xiàn),也許是兜兜轉(zhuǎn)轉(zhuǎn)的緣故,瀏覽器對(duì)這種訪問(wèn)可能有一些處理。
- 當(dāng)?shù)谝淮我驗(yàn)橄到y(tǒng)初始化未完成,或其他什么原因,加載失敗的話,后面就會(huì)一直失敗。
- 這時(shí)候?qū)g覽器關(guān)掉,重新打開再訪問(wèn),或者換一種瀏覽器,就可以成功。
- 否則一直試,一直試,永遠(yuǎn)都找不到原因。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx 根據(jù)URL帶的參數(shù)轉(zhuǎn)發(fā)的實(shí)現(xiàn)
這篇文章主要介紹了Nginx 根據(jù)URL帶的參數(shù)轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Nginx的nginx.conf配置文件中文注釋說(shuō)明
這篇文章主要介紹了Nginx的nginx.conf配置文件中文注釋說(shuō)明,本文是個(gè)人注釋版,在生產(chǎn)環(huán)境中經(jīng)常使用,需要的朋友可以參考下2014-12-12Nginx配置后請(qǐng)求報(bào)404的幾種問(wèn)題解決方法
本文主要介紹了Nginx配置后請(qǐng)求報(bào)404的兩種常見(jiàn)問(wèn)題及其解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02nginx+php出現(xiàn)No input file specified解決辦法
這篇文章主要介紹了nginx+php出現(xiàn)No input file specified解決辦法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03nginx反向代理失效前端無(wú)法獲取后端的數(shù)據(jù)解決辦法
Nginx服務(wù)器的反向代理服務(wù)是其最常用的重要功能,由反向代理服務(wù)也可以衍生出很多與此相關(guān)的Nginx服務(wù)器重要功能,下面這篇文章主要給大家介紹了關(guān)于nginx反向代理失效前端無(wú)法獲取后端的數(shù)據(jù)解決的相關(guān)資料,需要的朋友可以參考下2023-12-12Nginx服務(wù)器中414錯(cuò)誤和504錯(cuò)誤的配置解決方法
這篇文章主要介紹了Nginx服務(wù)器中414錯(cuò)誤和504錯(cuò)誤的配置解決方法,分別對(duì)應(yīng)Request-URI Too Large和Gateway Time-out這樣的錯(cuò)誤提示,需要的朋友可以參考下2015-12-12nginx反向代理服務(wù)器及負(fù)載均衡服務(wù)配置方法
正向代理一般是在客戶端設(shè)置代理服務(wù)器,通過(guò)代理服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求,最終訪問(wèn)到目標(biāo)服務(wù)器,這篇文章主要介紹了nginx反向代理服務(wù)器及負(fù)載均衡服務(wù)配置方法,需要的朋友可以參考下2023-12-12nginx 平滑重啟與升級(jí)的實(shí)現(xiàn)方法
有時(shí)候我們需要平滑重啟nginx服務(wù),防止出現(xiàn)問(wèn)題,這里簡(jiǎn)單的總結(jié),方便需要的朋友2013-02-02