在GET请求中提到两次确认令牌,但在URL中只提到一次?

时间:2016-02-04 08:08:59

标签: ruby-on-rails http nginx devise passenger

当我按照设计电子邮件中的确认链接时,我遇到了一个奇怪的错误。链接是正确的:

.../ru/users/confirmation?confirmation_token=yDNePwDTbxBzy5PqZE1e

但是在服务器日志中我得到:

Started GET "/ru/users/confirmation?confirmation_token=yDNePwDTbxBzy5PqZE1e?confirmation_token=yDNePwDTbxBzy5PqZE1e"

如你所见,它被提到两次。出于这个原因,我无法确认电子邮件。

最奇怪的是它在webrick中有效,我只在生产中看到这个问题(恰好是nginx +乘客)。

这可能是我的设置问题。我使用的是Rails v4和Devise v3。我重新编写了默认设计确认#edit控制器和其他几个,因为我想实现"通过电子邮件注册"策略,并使用ldap_authenticatable模型而不是database_authenticatable。我还修补了ldap_authenticatable以支持多个LDAP。但即便如此 - 你能指出我应该在哪里挖掘我的问题吗?

修改

中间件:生产环境缩短了4个条目:

  • 生产

      $ RAILS_ENV=production bundle exec rake middleware 
      use Rack::Sendfile 
      use Rack::Lock 
      use Rack::Runtime 
      use Rack::MethodOverride 
      use ActionDispatch::RequestId 
      use Rails::Rack::Logger 
      use ActionDispatch::ShowExceptions 
      use ActionDispatch::DebugExceptions 
      use ActionDispatch::RemoteIp 
      use ActionDispatch::Callbacks 
      use ActiveRecord::ConnectionAdapters::ConnectionManagement 
      use ActiveRecord::QueryCache 
      use ActionDispatch::Cookies 
      use ActionDispatch::Session::CookieStore 
      use ActionDispatch::Flash
      use ActionDispatch::ParamsParser
      use Rack::Head
      use Rack::ConditionalGet
      use Rack::ETag
      use Warden::Manager
      run Login::Application.routes
    
  • 发展:

      $ RAILS_ENV=development bundle exec rake middleware
      use Rack::Sendfile
    + use ActionDispatch::Static
      use Rack::Lock
      use Rack::Runtime
      use Rack::MethodOverride
      use ActionDispatch::RequestId
      use Rails::Rack::Logger
      use ActionDispatch::ShowExceptions
    + use WebConsole::Middleware
      use ActionDispatch::DebugExceptions
      use ActionDispatch::RemoteIp
    + use ActionDispatch::Reloader
      use ActionDispatch::Callbacks
    + use ActiveRecord::Migration::CheckPending
      use ActiveRecord::ConnectionAdapters::ConnectionManagement
      use ActiveRecord::QueryCache
      use ActionDispatch::Cookies
      use ActionDispatch::Session::CookieStore
      use ActionDispatch::Flash
      use ActionDispatch::ParamsParser
      use Rack::Head
      use Rack::ConditionalGet
      use Rack::ETag
      use Warden::Manager
      run Login::Application.routes
    

修改2

我发现原因是什么:电子邮件中的链接是http。如果我将其更改为https - 它可以工作。所以只需要添加

 config.action_mailer.default_url_options = {:protocol => 'https'}
config/environments/production.rb

并且它可以正常工作(在Web服务器重启时)。 source

0 个答案:

没有答案