在Camping / Rack中,如何获取应用的基本网址?我想知道,所以我可以把它放在它发送的电子邮件中。
可能是(正在开发中)
或
http://localhost:9292
或
http://localhost:80/game
或正在制作
http://fancy-snake.heroku.com
答案 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_NAME
和SERVER_PORT
。此外还有处理代理请求的问题,您需要原始请求的主机名,而不是后端服务器。同样,Rack::Request
提供了处理这些问题的host_with_port
和host
方法。
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>