iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0

Powerful and Portable

Rack 被應用在許多 Rails 應用程式中,像是 Sinatra、Cuba、Rum、Grape、Camping、Padrino、Ramaze、Maverick

代表你在其他的框架中,你可以使用 Rack 應用程式

還記得 Rack::Auth::Basic 嗎?

他會引進 HTTP 基本認證 ,像是 RFC 2617

可以用它來保護應用程式或者 API 的密碼

有另一個套件跟 Rack::Auth::Basic 類似

叫做 Warden

會針對 Rack 為架構的應用程式提供全面的帳戶認證機制

接下來我們來介紹一些 Rack 的應用程式

web小辭典

RFC 2617

會生成隨機數來維護安全性的 HTTP 認證架構

RFC 2617 強化了安全性,來防止技術性攻擊

Built-In Middleware

以下是一些內建的 Middleware

Rack::Auth::Digest - HTTP Digest 認證
Rack::CommonLogger - 登入請求
Rack::Config - 在每一次 request 後呼叫一個 block
Rack::ContentLength - 自動設定 content 的長度
Rack::ContentType - 試著猜測 content 的 type 並且設定它
Rack::Deflater - 把 response 壓縮成一個 gzip 或字串
Rack::Directory - 增加 Apache格式的檔案列表,是一種 endpoint 而非 intermediate layer,所以會使用 run
Rack::ETag - 從 content 的 MD5s 產生 ETags
Rack::Head - 針對 HEAD 的 request 移除 response 的 body
Rack::Lint - 確認 responses 的 correctness.
Rack::Lock - 一次只允許一個程序
Rack::Reloader - 當檔案更改時,重新載入你的 app
Rack::Sendfile - 用更快速的方法,使用 X-Sendfile header 發送請求給瀏覽器
Rack::ShowExceptions - 有東西壞掉時,傳送一個好的 exception
Rack::ShowStatus - 假如內容是空的,傳送一個美化過的網頁
Rack::Static - 從靜態檔案渲染,而非從框架渲染
Rack::URLMap - 使用 map 給不同的 app 及 stack 不同的路徑檔案

Third-Party Middleware

接下來介紹一些第三方的 Middleware

Rack::Cache - 即安裝即用的 HTTP caching.
Rack::GoogleAnalytics - 在每個頁面上加上 GA 追蹤碼
Rack::HoneyPot - 用假表單來防止垃圾機器人
Rack-a-Mole - 透過登入及存在於 MongoDB 來監視你的 APP
Rack::Mount - 在不同的資料夾下跑不同的 app
Rack::Referrals - 列出你網站上的搜尋關鍵字
Rack::Throttle - 限制傳入請求

這些套件會比內建的好用一些,通常用 gem install 就可以安裝

More Complicated Middleware

剛剛有提到 Rack::URLMap 可以讓你在 config.ru 使用 map 給不同的 app 及 stack 不同的路徑檔案

現在我們來看一下他怎麼運做的

# sample_dir/config.ru
  require "rack/lobster"
  use Rack::ContentType
  map "/lobster" do
    use Rack::ShowExceptions
    run Rack::Lobster.new
  end
  
  map "/lobster/but_not" do
    run proc {
      [
        200, 
        {}, 
        ["Really not a lobster"]
      ]
    }
  end
  
  run proc {
    [
      200, 
      {}, 
      ["Not a lobster"]
    ]
  }

假設跑 rackup ,瀏覽器畫面會出現 Not a lobster

但假如你到 http://localhost:3001/lobster

你會看到用 ASCII 畫出來的龍蝦

Map 會告訴 Rack app 該去哪個路徑,會優先選較長的路徑

我們使用 Rack::ContentType 去設定預設的 HTML content type

另外使用 Rack::ShowExceptions ,來遇到你不小心進入 crash 的狀況,他會秀出一個漂亮的頁面,並不是像預設的只秀出單純的錯誤狀態


上一篇
Day 19 Rack Middleware
下一篇
Day 21 - Rack Middleware
系列文
從0開始刻 淺談 Rails 的運作魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言