我想将人们从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
除非我特意在网址栏中输入https://www.example.com,否则这种情况很有效。这似乎是在中间件执行之前通过SSL进入我的应用程序。我在浏览器中收到此消息:
This server could not prove that it is www.example.com; its security certificate is from example.com.
如何更改此行为?我正在使用Heroku进行制作。是否有任何我不知道的创业板呢?
答案 0 :(得分:1)
您无法更改此行为:浏览器正在尝试连接到https://www.example.com,但您的证书适用于其他域。此时您的申请并未参与其中。
处理此问题的唯一方法是获得对www.example.com和example.com都有效的ssl证书