2011-11-13 21 views
2

我在一個非常低流量的網站上看到了一些例外情況。例外情況如下所示:如何在Rails 3.1中處理丟失的主機頭文件

Missing host to link to! Please provide the :host parameter, 
    set default_url_options[:host], or set :only_path to true 
actionpack (3.1.1) lib/action_dispatch/http/url.rb:25:in `url_for' 

------------------------------- 
Request: 
------------------------------- 

* URL  : http:/// 

爲了清楚起見,刪除了這部分內容,但沒有其他重要的識別細節。例如沒有用戶代理或引用者。看起來正在發生的是這些是缺少Host標頭的HTTP/1.0請求。現在我很奇怪甚至發生了這個異常,因爲所討論的域名是由使用301的nginx規範化的,因此如果不使用正確的域名,甚至不可能到達Rails應用程序。

我不明白爲什麼Rails會依賴於這個頭文件,因爲Nginx似乎應該通過更可靠的規範域,但是我對Rack內部機制並不熟悉。如果任何人有任何指導如何最好地解決這個問題,我將不勝感激。

  • Rails/Rack是否有很好的理由取決於這個頭?
  • 這裏有可能是一個機架bug嗎?
  • 我應該用中間件注入頭部嗎?
  • 我應該在Rails中篡改一些東西來壓制它嗎?
  • 我應該配置Nginx拒絕HTTP/1.0請求嗎?
+0

我們釋放了我們的安全審計機器人,他們通過HTTP/1.0請求產生了大量的這些異常。仍在尋求解決。 – whatbird

回答

0

如果沒有客戶端使用正確的域名,可能無法到達應用程序,但這不是問題。問題是服務器知道正確的域名。如果沒有Host標題並且沒有完全限定的URL,那麼服務器如何知道客戶端請求了哪個主機?

+0

好問題,我不知道,因爲我沒有完整的請求日誌,也不知道用戶代理髮送了什麼。我並不十分熟悉HTTP協議,但Host頭部不能是發送域的唯一地方,因爲HTTP/1.0不需要它,而nginx肯定會看到正確的域(否則它會是在它有機會提出例外之前重定向)。 – gtd

+0

主機不一定是發送域的唯一地方,但如果域未發送到任何地方,則報告的錯誤通常是缺少主機頭,因爲這是通常發送的地方。 –