2013-05-19 31 views
0

我正在通過Lift的基礎知識Section 3.2 SiteMap of Simply Lift,有一件事給我留下了深刻的印象。不允許在URI中使用「.xml」/「。html」/「index」?

使用默認SiteMap代碼,你可以問,比如說,info鑑於方式:

  • GET /info
  • GET /info.html
  • GET /info.xml(爲什麼?)。

更重要的是,你可以在不同的方式來請求index觀點:

  • GET /
  • GET /index
  • GET /index.html
  • GET /index.xml

如何限制這種行爲爲GET /目錄和GET /info文件?


P.S.所有這些返回200 OK

不應該有一個資源只有一個URL?

+0

這種行爲的缺點是什麼?它以什麼方式壞? – VasyaNovikov

+0

@VasyaNovikov,也許在搜索引擎機器人的方式。 :)我的意思是......沒有機器人應該拿出'.html' /'.xml'的URL,但是'/ dir/index'和'/ dir /'很可能(例如自動生成的菜單使用'/ dir/index '鏈接)。 –

回答

3

實際上有四種以上的方式可以解析。可以找到已知後綴的完整列表(其中任何一個可以用來訪問該頁面)here

我認爲這樣做的原因是lift可以用來爲任何資源提供服務,所以大多數都是默認顯式添加的。

我想你可以通過添加這Boot.scala禁用所有擴展Lift的處理:

LiftRules.explicitlyParsedSuffixes = Nil 

不過,我不會建議,由於可能有一些副作用。

使用ReqRestHelper您可以明確指定後綴,但我不知道是否有這樣的構造與Sitemap這樣做。

+0

「一些副作用」?這聽起來很可怕。 – nafg

+0

這很多鏈接到一個視圖,這很有趣。也許'SiteMap'的實現應該改變呢?據我所知,它只用於動態HTML頁面。儘管如此,你的代碼仍然有效(至於後綴,「/ index」問題仍然是開放的)。 'Nil'不能用於'Set's,'Set()'或者'Set.empty'這個技巧(見http://stackoverflow.com/questions/10506226)。謝謝! –

+0

該索引是一個非常標準的約定。大多數Web服務器都有一個用於創建默認文檔(apache中的directoryindex,nginx中的索引等)的構造,它在內部將'/'的請求重定向到默認文檔 - 並且都響應。我不認爲有一種禁用方法。 Lift也使用這種慣例,我很確定大多數搜索引擎都是這個原因。你可以在野外找到很多例子,如:http://www.nytimes.com和http://www.nytimes.com/index.html或http://www.facebook.com和http:// www .facebook.com/ index.php – jcern

2

實際上,確定Lift是否應該處理請求的代碼是here。您可以直接在上面的liftHandled方法中看到默認擴展名,但它們全都可以用LiftRules.liftRequest覆蓋。例如:

LiftRules.liftRequest append { 
    case r => Full(r.path.suffix.trim == "") 
} 

應該這樣做。

至於它爲什麼這樣工作,傑森是正確的,該設計是爲了處理多種類型的動態資源。

+0

1)+1的回購鏈接,我想這仍然是獲得Lift的最佳方式。 :) 2)你的代碼只在沒有'Full()'包裝的情況下編譯,但它並沒有辦法。 :<3)不應該使用Accept:頭來處理多種類型? –