我的应用的基本网址是什么?

时间:2012-10-14 18:07:16

标签: ruby rack camping

在Camping / Rack中,如何获取应用的基本网址?我想知道,所以我可以把它放在它发送的电子邮件中。

可能是(正在开发中)

http://localhost:9292

http://localhost:80/game

或正在制作

http://fancy-snake.heroku.com

3 个答案:

答案 0 :(得分:2)

到目前为止我已经

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

这似乎适用于第一和第三种情况。如果应用程序位于localhost/prefix

,我不知道是否写入

答案 1 :(得分:2)

你必须要小心一点,因为有一些微妙的潜在陷阱。 Rack::Request class可能会对此有所帮助。

首先,你无法真正获得 app 的网址,因为它可能会响应多个网址(通过Rack路由,Apache配置等),所以你正在寻找获取特定请求的网址。如果您只提供来自一个网址的请求,这无关紧要。

请求的方案位于env下的rack.url_scheme哈希中,但这仅适用于请求的“最后一段”。如果您的应用程序位于某种代理(Nqinx,Apache等)后面,那么您希望获得实际请求的方案,而不是从代理到您的应用程序运行的计算机的请求。如果您已正确配置代理,则应设置标题,以便了解原始方案的内容。 Rack::Request has a scheme method考虑​​了这些标题。

网址的主机可能位于env密钥下的HTTP_HOST哈希中,但此标头不一定存在(诚然,现在非常不合适)。您应该回到SERVER_NAMESERVER_PORT。此外还有处理代理请求的问题,您需要原始请求的主机名,而不是后端服务器。同样,Rack::Request提供了处理这些问题的host_with_porthost方法。

Rack::Request还提供了一个base_url method组合方案和主机,另外只包括端口(如果与默认端口不同)(80或443)。

您的应用安装位置位于env密钥下的SCRIPT_NAME哈希中。在第二个示例中,这将是/game,如果您的应用程序安装在服务器的根目录下,则可以为空。同样,Rack::Request提供了script_name method,尽管这只是返回env哈希中条目的值。

因此,总而言之,您可能希望使用以下内容:

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

看起来非常简单,但为您提供各种可能性。

此外,你可以找到有用的Rack specification,它包含env哈希中应该包含的各种条目的详细信息。

答案 2 :(得分:1)

Camping有一个名为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>