在HTTPS中设计confirmation_url

时间:2014-02-17 11:39:07

标签: ruby-on-rails ssl nginx devise

我的网站完全是SSL,因此我想将设计(3.2.2)生成的网址验证为https://....

目前网址是由:

生成的
confirmation_url(@resource, :confirmation_token => @token)

产生好的网址,如:

http://example.com/users/confirmation?confirmation_token=zqfHS35ckLQZscSbsgMm

我希望网址

https://example.com/users/confirmation?confirmation_token=zqfHS35ckLQZscSbsgMm

此外,目前电子邮件验证不起作用,因为nginx操作重定向到https相当于每个页面,并且由于某些原因,事情搞砸了,https版本已损坏网址,如:

https://example.com/users/confirmation?confirmation_token=zqfHS35ckLQZscSbsgMm?confirmation_token=zqfHS35ckLQZscSbsgMm

由于某些原因,nginx重定向到这个已损坏的URL,因此Unicorn不得不拒绝该请求。

任何线索?

2 个答案:

答案 0 :(得分:2)

您可以在电子邮件模板中指定协议,就像您在自己的答案中所做的那样,或者您可以在邮件程序中将其指定为默认值。如果您对所有使用https链接的电子邮件感到满意,最简单的方法是将其添加到您的应用配置中。例如,在您的production.rb中:

  config.action_mailer.default_url_options = {:protocol => 'https', :host => 'example.com'}

我知道如果你直接使用https就不再重要了,但是你的网址从http到https的nginx重定向看起来像是将查询字符串附加到整个网址,所以这样做是值得修复的它适用于所有情况,即使您不再需要它用于电子邮件。如果您在nginx配置中使用return 301 …语句,可能会有一个您不需要的尾随$query_string$args - 例如,如果您使用{{1}已经有GET参数。

另外,我认为你不会在任何地方找到确认_url。如果您尝试$request_uri,您可能会看到其中一个是:

rake routes

这意味着一般会自动提供user_confirmation_url帮助程序。我认为设计然后允许你使用confirmation_url,因为它巧妙地跟踪你正在使用的范围(在这种情况下是'用户'),虽然我必须承认我没有在设计的路由中看到足够的代码以确切知道如何它是为路线做的。

答案 1 :(得分:1)

我将方法调用更改为:

 confirmation_url(@resource, :confirmation_token => @token, protocol: "https")

并开始根据需要正确生成https的网址。

虽然在设计代码中找不到confirmation_url的定义。