【发布时间】:2015-03-26 19:04:33
【问题描述】:
我想将人们从输入 www.mydomain.com 重定向到 mydomain.com。 我也想强迫人们使用 SSL。 为此,我编写了两个中间件类。一个从 www 子域重定向到根域:
class WwwMiddleware
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)
if request.host.starts_with?("www.")
[301, {"Location" => request.url.sub("//www.", "//")}, self]
else
@app.call(env)
end
end
def each(&block)
end
end
第二个强制SSL连接:
class ForceSSL
def initialize(app)
@app = app
end
def call(env)
req = Rack::Request.new(env)
if env['HTTPS'] == 'on' || env['HTTP_X_FORWARDED_PROTO'] == 'https'
@app.call(env)
else
[301, {"Location" => req.url.gsub(/^http:/, "https:")}, []]
end
end
end
这很好用,除非我在 URL 栏中专门输入 https://www.example.com。这似乎在中间件执行之前通过 SSL 进入我的应用程序。我在浏览器中收到此消息:
This server could not prove that it is www.example.com; its security certificate is from example.com.
如何改变这种行为?我正在使用 Heroku 进行生产。有没有我不知道的 GEM 可以做到这一点?
【问题讨论】:
-
为什么不在 nginx 或 apache 服务器配置中尝试同样的方法。
-
哦,我应该将此添加到我的帖子中。我正在使用heroku进行生产。有没有办法做到这一点?
-
我不确定。我没用过。但必须有。
标签: ruby-on-rails ruby ruby-on-rails-4