2010-02-27 51 views

回答

5

實際上需要隔離所有環境條目其前綴HTTP_CONTENT_,這符合您的HTTP標頭,例如:

# CONTENT_LENGTH -> Content-Length 
# HTTP_COOKIE -> Cookie 
# HTTP_USER_AGENT -> User-Agent 
@headers |= request.env.inject({}) { |h, (k, v)| 
    if k =~ /^(HTTP|CONTENT)_/ then 
    h[k.sub(/^HTTP_/, '').dasherize.gsub(/([^\-]+)/) { $1.capitalize }] = v 
    end 
    h 
} 

或者,你可以更嚴格並且僅查找特定的HTTP headers,以避免意外拾取可能看起來像標題但實際上不是有效的環境變量,例如CONTENT_BLAHTTP_DUMMY

@headers |= %w[ CONTENT_LENGTH CONTENT_TYPE HTTP_ACCEPT 
HTTP_REFERER HTTP_USER_AGENT ].inject({}) { |h, k| 
    if v = request.env[k] then 
    h[k.sub(/^HTTP_/, '').dasherize.gsub(/([^\-]+)/) { $1.capitalize }] = v 
    end 
    h 
} 

看看actionpack/lib/action_controller/request.rb看他們如何梳理環境中提取請求頭。

+0

我不能去第二個,因爲所有的http頭(即擴展頭)都是未知的服務器。那些標題,如X-Runtime,將顯示爲env HTTP_X-RUNTIME? Regards – 2010-02-28 01:45:53

+0

這將是'HTTP_X_RUNTIME'在環境中,'X-Runtime'在結果'@ headers'哈希中。第二個片段只使用可能對您有意思的標題的「白名單」(以篩選出不感興趣的內容);如果白名單上的某些內容實際上並不存在於您的環境中,則它不會被添加到'@ headers';反過來說,如果它在環境中,但不在白名單上,它不會被添加到'@ headers'中。 – vladr 2010-02-28 02:01:39

+0

謝謝弗拉德...生病了,第一個選擇:我需要所有的請求標題 - 即使那些我不知道,所以我不能去與白名單。 – 2010-02-28 02:52:40

相關問題