1. 程式人生 > >使用lua實現nginx rewrite

使用lua實現nginx rewrite

上一次上線只是簡單的把手機端的流量切換手機端的首頁,有點粗糙,現在需要把電腦端相應的頁面切換到電腦端的頁面,直接用nginx自帶的rewrite不太好做,所以用lua做

下面開始程式碼

nginx 配置

location / {
    rewrite_by_lua_file lua/mobile.lua;
    ... # 反向代理
}

mobile.lua程式碼

-- 手機訪問重定向到移動版

local agent = ngx.var.http_user_agent

if agent ~= nil then
    local m, ret = ngx.re.match(agent, "Android|webOS|iPhone|iPod|BlackBerry"
) if m ~= nil then local queryString = ngx.var.args if queryString == nil then queryString = "" end local rewrite_urls = {} rewrite_urls["/"] = "/app/index.html" rewrite_urls["/coin/index.html"] = "/app/coin.html" rewrite_urls["/equity/index.html"] = "/app/coin.html"
rewrite_urls["/guide/index.html"] = "/app/guide.html?" .. queryString rewrite_urls["/market/trade.html"] = "/app/trade.html?" .. queryString rewrite_urls["/account/fund.html"] = "/app/account.html?" .. queryString rewrite_urls["/guide/article.html"] = "/app/guide-details.html?" .. queryString local
redirect_uri = rewrite_urls[ngx.var.uri] if redirect_uri then ngx.redirect(redirect_uri, ngx.HTTP_MOVED_TEMPORARILY) end end end

其實邏輯也很簡單,主要在nginx rewrite 階段完成頁面跳轉,判斷是否手機端,然後通過一個table把對應的url對映好,直接以當前uri作為key取table的值,如果取到說明有對映關係,直接把值當成新的url重定向過去

queryString是get引數,有的需要有的不需要,不帶引數的話,有點頁面會有問題,比如文章詳情,是需要文章ID的

通過lua可以寫很複雜的服務端處理邏輯,應用程式只需要做好自己的事情就好了