nginx內(nèi)部訪問特性如何實(shí)現(xiàn)靜態(tài)資源授權(quán)訪問
nginx內(nèi)部訪問特性實(shí)現(xiàn)靜態(tài)資源授權(quán)訪問
在nginx中,將靜態(tài)資源設(shè)為internal;然后將前端的靜態(tài)資源地址改為指向后端,在后端的響應(yīng)頭部中寫上靜態(tài)資源地址。
近期客戶對我們項(xiàng)目做安全性測評,暴露出一些安全性問題,其中一個(gè)是有些靜態(tài)頁面(*.html)無須授權(quán)即可直接訪問,里面的信息一覽無遺,不安全。
這些靜態(tài)頁面都是arcgis地圖頁面,依賴arcgis for js,沒有辦法做成一般意義上的動(dòng)態(tài)頁面。或者說,該項(xiàng)目是個(gè)老項(xiàng)目,目前只處于維護(hù)階段,大規(guī)模改頭換面不現(xiàn)實(shí)。
怎么辦,有沒有什么方法,不改這些靜態(tài)頁面,或者是不做大的調(diào)整,就能實(shí)現(xiàn)只有登錄后才能訪問它們呢?
看到網(wǎng)上有文章介紹,可以利用nginx的internal特性,將靜態(tài)資源設(shè)為內(nèi)部訪問,即可實(shí)現(xiàn)需要鑒權(quán)才能訪問。
原理說起來也比較簡單。所謂內(nèi)部訪問,是指你直接在瀏覽器輸入靜態(tài)資源地址,將無法訪問,會(huì)直接報(bào)404,只有通過后端向nginx發(fā)送特定信息才可以。而后端,我們是要登錄系統(tǒng)以后才能請求的,所以就能實(shí)現(xiàn)我們想要的效果了。
具體來說就是:
假設(shè)我們前端部署在nginx,原本我們要訪問某個(gè)靜態(tài)頁面:/A.html,現(xiàn)在不行了,要將地址改為 /api/static/getA,改而向后端請求;后端收到請求后,在響應(yīng)信息頭里加上一句:
response.setHeader("X-Accel-Redirect", "/A.html");返回;nginx接收到響應(yīng)信息后,于是將/A.html最終返回。
現(xiàn)在來真的,我們要實(shí)現(xiàn)/projects/dzzhyj/index.html的鑒權(quá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)部訪問
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é)果
直接訪問靜態(tài)頁面,不行

通過后端地址可以

但后端必須登錄才行

完美。
說下總結(jié)
這功能在nginx下才能使用。
其他web服務(wù)器有沒有類似機(jī)制不得而知。
但我們平時(shí)開發(fā),用vue,都直接用npm來跑,所以后端代碼做點(diǎn)更改,判斷是nginx發(fā)出的請求,才做上述處理,否則跳轉(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()) {
// 請求經(jīng)過了 Nginx
response.setHeader("X-Accel-Redirect", "/projects/dzzhyj/index.html");
} else {
// 請求未經(jīng)過 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í)沒有方法能直接判斷請求是否來自nginx,我是比較了從node發(fā)出的請求和從nginx發(fā)出的請求所包含的鍵值,看其中有沒有包含“X-Real-IP”,簡單地做了一下判斷,不一定對。
1)vue運(yùn)行時(shí)的請求request結(jié)構(gòu)

2)nginx的request

補(bǔ)充:
- 我發(fā)現(xiàn),也許是兜兜轉(zhuǎn)轉(zhuǎn)的緣故,瀏覽器對這種訪問可能有一些處理。
- 當(dāng)?shù)谝淮我驗(yàn)橄到y(tǒng)初始化未完成,或其他什么原因,加載失敗的話,后面就會(huì)一直失敗。
- 這時(shí)候?qū)g覽器關(guā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),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
nginx+php出現(xiàn)No input file specified解決辦法
這篇文章主要介紹了nginx+php出現(xiàn)No input file specified解決辦法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
nginx反向代理失效前端無法獲取后端的數(shù)據(jù)解決辦法
Nginx服務(wù)器的反向代理服務(wù)是其最常用的重要功能,由反向代理服務(wù)也可以衍生出很多與此相關(guān)的Nginx服務(wù)器重要功能,下面這篇文章主要給大家介紹了關(guān)于nginx反向代理失效前端無法獲取后端的數(shù)據(jù)解決的相關(guān)資料,需要的朋友可以參考下2023-12-12
Nginx服務(wù)器中414錯(cuò)誤和504錯(cuò)誤的配置解決方法
這篇文章主要介紹了Nginx服務(wù)器中414錯(cuò)誤和504錯(cuò)誤的配置解決方法,分別對應(yīng)Request-URI Too Large和Gateway Time-out這樣的錯(cuò)誤提示,需要的朋友可以參考下2015-12-12
nginx反向代理服務(wù)器及負(fù)載均衡服務(wù)配置方法
正向代理一般是在客戶端設(shè)置代理服務(wù)器,通過代理服務(wù)器轉(zhuǎn)發(fā)請求,最終訪問到目標(biāo)服務(wù)器,這篇文章主要介紹了nginx反向代理服務(wù)器及負(fù)載均衡服務(wù)配置方法,需要的朋友可以參考下2023-12-12

