在有些情況下我們需要對我們伺服器上的資源進行加密訪問,那麼我們需要如何來實現呢?
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 成功