【问题标题】:devise confirmation_url in HTTPS在HTTPS中设计confirmation_url
【发布时间】:2014-02-17 11:39:06
【问题描述】:

我的网站完全是 SSL,所以我还想将 devise (3.2.2) 生成的用于电子邮件验证的 url 设为https://....

目前的 urls 是通过以下方式生成的:

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 版本是一个损坏的 url,例如:

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

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

有什么线索吗?

【问题讨论】:

    标签: ruby-on-rails ssl nginx devise


    【解决方案1】:

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

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

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

    另外,我认为您不会在任何地方找到直接定义的confirmation_url。如果您尝试rake routes,您可能会看到其中之一是:

    user_confirmation GET    /users/confirmation(.:format)     {:controller=>"devise/confirmations", :action=>"show"}
    

    这意味着将自动有一个 user_confirmation_url 助手可用,就像一般的路由一样。我认为 devise 然后允许您使用confirmation_url,因为它巧妙地跟踪您正在使用的范围(在这种情况下为“用户”),但我必须承认我没有在设计的路由中查看足够多的代码以确切地知道如何它是为路线做的。

    【讨论】:

      【解决方案2】:

      我把方法调用改成:

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

      然后根据需要开始正确生成带有https 的网址。

      我在设计代码的任何地方都找不到confirmation_url 的定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-19
        • 2017-08-31
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        相关资源
        最近更新 更多