当我按照设计电子邮件中的确认链接时,我遇到了一个奇怪的错误。链接是正确的:
.../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