nginx內部訪問特性如何實現(xiàn)靜態(tài)資源授權訪問
nginx內部訪問特性實現(xiàn)靜態(tài)資源授權訪問
在nginx中,將靜態(tài)資源設為internal;然后將前端的靜態(tài)資源地址改為指向后端,在后端的響應頭部中寫上靜態(tài)資源地址。
近期客戶對我們項目做安全性測評,暴露出一些安全性問題,其中一個是有些靜態(tài)頁面(*.html)無須授權即可直接訪問,里面的信息一覽無遺,不安全。
這些靜態(tài)頁面都是arcgis地圖頁面,依賴arcgis for js,沒有辦法做成一般意義上的動態(tài)頁面?;蛘哒f,該項目是個老項目,目前只處于維護階段,大規(guī)模改頭換面不現(xiàn)實。
怎么辦,有沒有什么方法,不改這些靜態(tài)頁面,或者是不做大的調整,就能實現(xiàn)只有登錄后才能訪問它們呢?
看到網(wǎng)上有文章介紹,可以利用nginx的internal特性,將靜態(tài)資源設為內部訪問,即可實現(xiàn)需要鑒權才能訪問。
原理說起來也比較簡單。所謂內部訪問,是指你直接在瀏覽器輸入靜態(tài)資源地址,將無法訪問,會直接報404,只有通過后端向nginx發(fā)送特定信息才可以。而后端,我們是要登錄系統(tǒng)以后才能請求的,所以就能實現(xiàn)我們想要的效果了。
具體來說就是:
假設我們前端部署在nginx,原本我們要訪問某個靜態(tài)頁面:/A.html
,現(xiàn)在不行了,要將地址改為 /api/static/getA,改而向后端請求;后端收到請求后,在響應信息頭里加上一句:
response.setHeader("X-Accel-Redirect", "/A.html");
返回;nginx接收到響應信息后,于是將/A.html
最終返回。
現(xiàn)在來真的,我們要實現(xiàn)/projects/dzzhyj/index.html的鑒權訪問。
實現(xiàn)步驟
一、配置nginx
server { listen 8001; server_name 192.168.0.218; 。。。 location /projects/dzzhyj/ { alias /home/gzdd_html/gzdd/projects/dzzhyj/;#物理路徑 location ~* \.html$ {#只設置*.html為內部訪問 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"); } }
四、運行結果
直接訪問靜態(tài)頁面,不行
通過后端地址可以
但后端必須登錄才行
完美。
說下總結
這功能在nginx下才能使用。
其他web服務器有沒有類似機制不得而知。
但我們平時開發(fā),用vue,都直接用npm來跑,所以后端代碼做點更改,判斷是nginx發(fā)出的請求,才做上述處理,否則跳轉:
@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); } } }
其實沒有方法能直接判斷請求是否來自nginx,我是比較了從node發(fā)出的請求和從nginx發(fā)出的請求所包含的鍵值,看其中有沒有包含“X-Real-IP”,簡單地做了一下判斷,不一定對。
1)vue運行時的請求request結構
2)nginx的request
補充:
- 我發(fā)現(xiàn),也許是兜兜轉轉的緣故,瀏覽器對這種訪問可能有一些處理。
- 當?shù)谝淮我驗橄到y(tǒng)初始化未完成,或其他什么原因,加載失敗的話,后面就會一直失敗。
- 這時候將瀏覽器關掉,重新打開再訪問,或者換一種瀏覽器,就可以成功。
- 否則一直試,一直試,永遠都找不到原因。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Nginx 根據(jù)URL帶的參數(shù)轉發(fā)的實現(xiàn)
這篇文章主要介紹了Nginx 根據(jù)URL帶的參數(shù)轉發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09nginx+php出現(xiàn)No input file specified解決辦法
這篇文章主要介紹了nginx+php出現(xiàn)No input file specified解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03nginx反向代理失效前端無法獲取后端的數(shù)據(jù)解決辦法
Nginx服務器的反向代理服務是其最常用的重要功能,由反向代理服務也可以衍生出很多與此相關的Nginx服務器重要功能,下面這篇文章主要給大家介紹了關于nginx反向代理失效前端無法獲取后端的數(shù)據(jù)解決的相關資料,需要的朋友可以參考下2023-12-12