下載服務(wù)器時(shí)常被人盜鏈,時(shí)間久了導(dǎo)致服務(wù)器大量資源浪費(fèi),由于服務(wù)器使用nginx做為web服務(wù)器。nginx的防盜鏈方法有很多,可以使用現(xiàn)成的防盜鏈模塊nginx-accesskey-2.0.3,編譯ningx時(shí)添加此模塊即可。
由于服務(wù)其他業(yè)務(wù)需要,所以nginx編譯了lua模塊,所以就想通過lua來實(shí)現(xiàn)下載服務(wù)器的防盜鏈功能(通過lua的Nginx模塊lua_nginx_module、這里不再詳細(xì)介紹配置過程),這樣就可以免去了accesskey模塊。原理就是生成經(jīng)過處理過的下載鏈接,然后下載服務(wù)器在處理這個(gè)下載鏈接,成功則下載,失敗則阻止。下面就是詳細(xì)的配置實(shí)例:
一、在下載頁面生成鏈接的nginx配置
download.vevb.com的配置:
server { listen 80; server_name download.vevb.com; index index.htm index.html; root /data/www/download; ssi on; location / { set_by_lua $downkey ' return ngx.md5("encryption" .. ngx.var.remote_addr .. "suffix") '; } }
注意:要開啟ssi才能在html頁面中獲取nginx自定義變量downkey,這樣才能生成經(jīng)過處理的url,其中字符串encryption和suffix為自定義的,可隨便改其他字符,目的是為了生成別人不容易猜解的串。
測試index.html代碼:
二、下載服務(wù)器nginx配置:
server { listen 80; server_name down.vevb.com; index index.htm index.html; root /data/www/down; limit_conn one 1; set $limit_rate 1000k; location / { set_by_lua $foo ' if string.sub(ngx.var.uri, 2, 33) == ngx.md5("encryption" .. ngx.var.remote_addr .. "suffix") then return 1 else return 0 end '; if ($foo = 1) { rewrite "^/([0-9a-z]{32})(.*?)$" $2 break; } if ($foo = 0) { rewrite ^/ http://download.vevb.com/404.htm redirect; } } }
這樣把鏈接復(fù)制給另外一臺(tái)機(jī)器后,就會(huì)打開提示錯(cuò)誤頁面。