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 強化了安全性,來防止技術性攻擊
以下是一些內建的 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 不同的路徑檔案
接下來介紹一些第三方的 Middleware
Rack::Cache - 即安裝即用的 HTTP caching.
Rack::GoogleAnalytics - 在每個頁面上加上 GA 追蹤碼
Rack::HoneyPot - 用假表單來防止垃圾機器人
Rack-a-Mole - 透過登入及存在於 MongoDB 來監視你的 APP
Rack::Mount - 在不同的資料夾下跑不同的 app
Rack::Referrals - 列出你網站上的搜尋關鍵字
Rack::Throttle - 限制傳入請求
這些套件會比內建的好用一些,通常用 gem install 就可以安裝
剛剛有提到 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 的狀況,他會秀出一個漂亮的頁面,並不是像預設的只秀出單純的錯誤狀態