ruby-on-rails Rails:将本地主机3000更改为https://

y0u0uwnf  于 2022-11-26  发布在  Ruby
关注(0)|答案(4)|浏览(205)

我正在开发rails 5应用程序并使用html5 geolocation

function getLocation() {
    if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(setGeoCookie);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function setGeoCookie(position) {
    var cookie_val = position.coords.latitude + "|" + position.coords.longitude;
    document.cookie = "lat_lng=" + escape(cookie_val);
}

它在firefox和除safari之外的所有浏览器上都能正常工作。在safari上,allow pop up不会出现。
我做了一些研究,发现Safari(不像Chrome和Firefox)不允许通过HTTP协议访问地理位置--只有HTTPS。即使是localhost。
解决方案是在开发中使用另一个浏览器,或者通过HTTPS提供Rails。
有人能给我一些关于如何在开发中通过HTTPS服务Rails的建议吗?

o2gm4chl

o2gm4chl1#

通过https服务Rails最简单的方法是使用ngrok。它只是提供了一个到localhost的安全隧道。非常容易使用

2j4z5cfb

2j4z5cfb2#

你也可以使用cloudflared https://github.com/cloudflare/cloudflared,它是免费的,没有ngrok的任何限制,比如必须经常改变域名。

qgelzfjb

qgelzfjb3#

尽管这个问题已经提出5年了,但我觉得我需要为将来遇到这个问题的人提供一些意见。我在使用Rails6和调用外部API时遇到过类似的问题,它只允许HTTPS连接。因此,经过一些研究,我发现最简单的解决方案是修改puma.rb文件,创建两个目录config/certsconfig/certs/.keep,并更新gitignore。必须将以下内容添加到puma.rb文件中:

if Rails.env.development?
  unless File.exist?(Rails.root.join('config', 'certs', 'localhost.key'))
    def generate_root_cert(root_key)
      root_ca = OpenSSL::X509::Certificate.new
      root_ca.version = 2 # cf. RFC 5280 - to make it a "v3" certificate
      root_ca.serial = 0x0
      root_ca.subject = OpenSSL::X509::Name.parse "/C=BE/O=A1/OU=A/CN=localhost"
      root_ca.issuer = root_ca.subject # root CA's are "self-signed"
      root_ca.public_key = root_key.public_key
      root_ca.not_before = Time.now
      root_ca.not_after = root_ca.not_before + 2 * 365 * 24 * 60 * 60 # 2 years validity
      root_ca.sign(root_key, OpenSSL::Digest::SHA256.new)
      root_ca
    end

    root_key = OpenSSL::PKey::RSA.new(2048)
    file = File.new( Rails.root.join('config', 'certs', 'localhost.key'), "wb")
    file.write(root_key)
    file.close

    root_cert = generate_root_cert(root_key)

    file = File.new( Rails.root.join('config','certs', 'localhost.cert'), "wb")
    file.write(root_cert)
    file.close
  end

  ssl_bind '0.0.0.0', '8443', {
      key: Rails.root.join('config','certs', 'localhost.key'),
      cert: Rails.root.join('config','certs', 'localhost.cert')
  }
end

我也创建了一个gist on GitHub太。我会很感激,如果你星星的主旨,这样你就可以很容易地找到最新的版本,它在未来。

46qrfjad

46qrfjad4#

您可以通过在application.rb中添加以下行,使Rails应用程序在HTTPS上运行

config.force_ssl = true

或者像Nwocha建议的那样,您也可以使用ngrok。

相关问题