在有些情況下我們需要對我們服務器上的資源進行加密訪問,那麼我們需要如何來實現呢?
1. 修改nginx配置
-
修改nginx配置,將需要加密訪問的資源設置為禁止外部訪問
# 資源真實存儲路徑 /upload 禁止外部直接訪問 location ^~ /upload { internal; }
-
設置訪問不存在資源時,跳轉到指定的php腳本進行解析
# 如果文件不存在,則rewrite到PHP腳本文件進行處理 if (!-f $request_filename) { rewrite ^/.*$ /attachment.php; }
-
根據如上配置nginx實現資源加密訪問實例
# 圖片真實存儲路徑 /upload 禁止外部直接訪問 location ^~ /upload/school { internal; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { # 如果文件不存在,則rewrite到PHP腳本文件進行處理 if (!-f $request_filename) { rewrite ^/.*$ /attachment.php; } expires 30d; error_log /dev/null; access_log /dev/null; }
2. attachment.php(資源解析腳本)
<?php // key參數為校驗參數,有該參數即可通過驗證,否則不通過 if (!isset($_GET['key'])) { exit('get img failed!'); } //key驗證邏輯 $imagePath = $_SERVER['DOCUMENT_ROOT'] . '/upload/'; $image = $_SERVER['REQUEST_URI']; // 拼接圖片真實全路徑 $fullPath = $imagePath . $image; // 獲取圖片mime信息 設置Content-type頭 $mime = getimagesize($fullPath)['mime']; header("Content-Type: $mime"); // 設置sendfile頭部,讓nginx跳轉到download下查找對應圖片 相當於交給nginx進行後續處理 header("X-Accel-Redirect: /upload/$image"); die;
- 根據如上就可以實現資源機密訪問,最總實現效果如下(站點域名為:www.test.com)
-- 例如資源真實地址為:/upload/test.jpg
-- 訪問 www.test.com/upload/test.jpg 失敗
-- 訪問 www.test.com/test.jpg 失敗
-- 訪問 www.test.com/test.jpg?key=XXX 成功