加密訪問資源方法總結

huaweichenai發表於2022-05-07

在有些情況下我們需要對我們伺服器上的資源進行加密訪問,那麼我們需要如何來實現呢?

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 成功

相關文章