在露營/機架中,如何獲取我應用的基本URL?我想知道,所以我可以把它放在它發送的電子郵件中。我的應用的基本網址是什麼?
這可能是(開發中)
或
http://localhost:9292
或
http://localhost:80/game
或生產
http://fancy-snake.heroku.com
在露營/機架中,如何獲取我應用的基本URL?我想知道,所以我可以把它放在它發送的電子郵件中。我的應用的基本網址是什麼?
這可能是(開發中)
或
http://localhost:9292
或
http://localhost:80/game
或生產
http://fancy-snake.heroku.com
露營有一個名爲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>
到目前爲止,我有
url = @env['rack.url_scheme'] + "://" + @env['HTTP_HOST'] + R(LoginX, u.secret)
這似乎適用於第一和第三種情況。我不知道它是否寫入如果應用程序是在localhost/prefix
你必須小心謹慎,因爲有一些微妙的潛在陷阱。 Rack::Request
class在這裏可能會有所幫助。
首先,你不能真正得到了應用的URL,因爲它可能會響應多個URL(通過機架路線,Apache的配置等),所以你看獲得的URL特別是要求。如果您只是從一個網址提供請求,這無關緊要。
該請求的方案位於env
哈希下的rack.url_scheme
,但這僅適用於請求的「最後一站」。如果您的應用程序位於某種類型的代理之後(Nqinx,Apache等),那麼您希望獲得真正請求的方案,而不是從代理到運行您的應用程序的計算機的請求。如果您已經正確配置了代理服務器,則應該設置一個標頭,以便您可以知道原始方案是什麼。 Rack::Request
has a scheme
method考慮到這些標題。
主機的網址是可能在HTTP_HOST
項下的env
哈希值,但這個頭不一定存在(當然這是相當unlikey現在)。你應該回到SERVER_NAME
和SERVER_PORT
。此外還有處理代理請求的問題,您需要原始請求的主機名,而不是後端服務器。再次,Rack::Request
提供了處理這些問題的方法host_with_port
和host
。
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
散列中的各種條目的詳細信息。
真棒,謝謝露營'URL(R(LoginX,u.secret))' –
這工作太:'URL( LoginX,u.secret)' –