2012-10-14 60 views
2

在露營/機架中,如何獲取我應用的基本URL?我想知道,所以我可以把它放在它發送的電子郵件中。我的應用的基本網址是什麼?

這可能是(開發中)

http://localhost:9292 

http://localhost:80/game 

或生產

http://fancy-snake.heroku.com 

回答

1

露營有一個名爲URL助手返回的絕對URL到您的應用程序:

URL()    # => #<URL:http://test.ing/blog/> 
URL() + "view/12" # => #<URL:http://test.ing/blog/view/12> 
URL("/view/12")  # => #<URL:http://test.ing/blog/view/12> 
+0

真棒,謝謝露營'URL(R(LoginX,u.secret))' –

+1

這工作太:'URL( LoginX,u.secret)' –

2

到目前爲止,我有

url = @env['rack.url_scheme'] + "://" + @env['HTTP_HOST'] + R(LoginX, u.secret) 

這似乎適用於第一和第三種情況。我不知道它是否寫入如果應用程序是在localhost/prefix

2

你必須小心謹慎,因爲有一些微妙的潛在陷阱。 Rack::Request class在這裏可能會有所幫助。

首先,你不能真正得到了應用的URL,因爲它可能會響應多個URL(通過機架路線,Apache的配置等),所以你看獲得的URL特別是要求。如果您只是從一個網址提供請求,這無關緊要。

該請求的方案位於env哈希下的rack.url_scheme,但這僅適用於請求的「最後一站」。如果您的應用程序位於某種類型的代理之後(Nqinx,Apache等),那麼您希望獲得真正請求的方案,而不是從代理到運行您的應用程序的計算機的請求。如果您已經正確配置了代理服務器,則應該設置一個標頭,以便您可以知道原始方案是什麼。 Rack::Request has a scheme method考慮到這些標題。

主機的網址是可能HTTP_HOST項下的env哈希值,但這個頭不一定存在(當然這是相當unlikey現在)。你應該回到SERVER_NAMESERVER_PORT。此外還有處理代理請求的問題,您需要原始請求的主機名,而不是後端服務器。再次,Rack::Request提供了處理這些問題的方法host_with_porthost

Rack::Request還提供了一個base_url method,它將方案和主機結合在一起,並且如果不同於默認值(80或443),則只包含端口。

您的應用程序所在的位置在SCRIPT_NAME密鑰下的env哈希中。在第二個例子中,這將是/game,如果您的應用程序安裝在您的服務器的根目錄下,則可以爲空。再次,Rack::Request提供了一個script_name method,雖然這只是簡單地返回env散列中條目的值。

因此,簡言之,你可能想使用這樣的事:

req = Rack::Request.new env 
url = req.base_url + req.script_name 

這看起來很簡單,但照顧的各種可能性爲您服務。

此外,您可以找到Rack specification有用的閱讀,它包含應該在env散列中的各種條目的詳細信息。

相關問題