此服务器的证书对于 S3 和 Paperclip 无效
Certificate for this server is invalid with S3 and Paperclip
我正在 Rails 5 应用程序中工作,该应用程序目前部署在 Heroku 上。我使用 Postgrsql 进行数据存储,Paperclip 管理图像上传,AWS S3 存储所有上传的图片。
为了完成这个,我使用了非常详细和有用的 tutorial from Heroku dev,这对我帮助很大。
我对 development
环境使用相同的配置以便能够对其进行测试。实际上它在开发中就像一个魅力。
当我部署到 Heroku 并在 运行 迁移后,设置 ENV 变量时,我创建了一个新的 Brochure
接受封面图片;一切顺利。图像正确存储在 AWS S3 中。
但是当我在视图中渲染图像时,我发现它不起作用。我在浏览器控制台中收到以下错误:
Safari 浏览器:
Failed to load resource: The certificate for this server is invalid. You might be connecting to a server that is pretending to be “sponsors.matchxperience.s3.amazonaws.com” which could put your confidential information at risk.
Chrom 金丝雀:
Failed to load resource: net::ERR_INSECURE_RESPONSE
我不知道怎么回事,因为在开发环境中一切正常。
任何人都可以帮我解决这个问题或知道发生了什么事吗?
production.rb(development.rb中相同)
Rails.application.configure do
# We’ll also need to specify the AWS configuration variables for the production Environment.
config.paperclip_defaults = {
storage: :s3,
# s3_protocol: 'http',
s3_credentials: {
bucket: ENV.fetch('AWS_S3_BUCKET'),
access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
s3_region: ENV.fetch('AWS_REGION')
}
}
end
brochure.rb
class Brochure < ApplicationRecord
# This method associates the attribute ":cover" with a file attachment
has_attached_file :cover, styles: {
card: '500x330#',
}
# Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :cover, :content_type => /\Aimage\/.*\Z/
end
paperclip.rb 在config/initializers/
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
在搜索和阅读此错误的不同来源后,我发现了许多针对类似错误的不同解决方案,但似乎没有人直接和真诚地与 Rails 5 相关,即使它有一些值得一看的地方,我也不知道Ruby 或 Rails.
我确信这是 AWS S3 服务器的问题,我是对的,我修复了它。最后阅读 creating a new bucket 的官方文档,我意识到它简单得可笑。
文档中说我们可以在存储桶名称中使用句点 .
和连字符 -
:
Can contain lowercase letters, numbers, periods (.), and hyphens (-).
Must start with a number or letter.
Must be between 3 and 63 characters long.
...
所以,我将我的存储桶命名为:
sponsors.matchxperience
写得对,但是谈论服务器的URL可能会混淆浏览器的请求指向不同的服务器,这在我的案例中发生了。这就是我收到该错误的原因。
解决方法
只需创建另一个存储桶(或重命名实际的存储桶可能起作用)并复制所有命名为:
的内容
sponsors-matchxperience
神奇的是,它在 Heroku 上的生产环境中运行良好。我不知道 AWS 文档发生了什么,但对我来说,错误是什么,我存储桶名称中的句点 .
。
我希望它对其他人有用。
我正在 Rails 5 应用程序中工作,该应用程序目前部署在 Heroku 上。我使用 Postgrsql 进行数据存储,Paperclip 管理图像上传,AWS S3 存储所有上传的图片。
为了完成这个,我使用了非常详细和有用的 tutorial from Heroku dev,这对我帮助很大。
我对 development
环境使用相同的配置以便能够对其进行测试。实际上它在开发中就像一个魅力。
当我部署到 Heroku 并在 运行 迁移后,设置 ENV 变量时,我创建了一个新的 Brochure
接受封面图片;一切顺利。图像正确存储在 AWS S3 中。
但是当我在视图中渲染图像时,我发现它不起作用。我在浏览器控制台中收到以下错误:
Safari 浏览器:
Failed to load resource: The certificate for this server is invalid. You might be connecting to a server that is pretending to be “sponsors.matchxperience.s3.amazonaws.com” which could put your confidential information at risk.
Chrom 金丝雀:
Failed to load resource: net::ERR_INSECURE_RESPONSE
我不知道怎么回事,因为在开发环境中一切正常。
任何人都可以帮我解决这个问题或知道发生了什么事吗?
production.rb(development.rb中相同)
Rails.application.configure do
# We’ll also need to specify the AWS configuration variables for the production Environment.
config.paperclip_defaults = {
storage: :s3,
# s3_protocol: 'http',
s3_credentials: {
bucket: ENV.fetch('AWS_S3_BUCKET'),
access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
s3_region: ENV.fetch('AWS_REGION')
}
}
end
brochure.rb
class Brochure < ApplicationRecord
# This method associates the attribute ":cover" with a file attachment
has_attached_file :cover, styles: {
card: '500x330#',
}
# Validate the attached image is image/jpg, image/png, etc
validates_attachment_content_type :cover, :content_type => /\Aimage\/.*\Z/
end
paperclip.rb 在config/initializers/
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
在搜索和阅读此错误的不同来源后,我发现了许多针对类似错误的不同解决方案,但似乎没有人直接和真诚地与 Rails 5 相关,即使它有一些值得一看的地方,我也不知道Ruby 或 Rails.
我确信这是 AWS S3 服务器的问题,我是对的,我修复了它。最后阅读 creating a new bucket 的官方文档,我意识到它简单得可笑。
文档中说我们可以在存储桶名称中使用句点 .
和连字符 -
:
Can contain lowercase letters, numbers, periods (.), and hyphens (-).
Must start with a number or letter.
Must be between 3 and 63 characters long.
...
所以,我将我的存储桶命名为:
sponsors.matchxperience
写得对,但是谈论服务器的URL可能会混淆浏览器的请求指向不同的服务器,这在我的案例中发生了。这就是我收到该错误的原因。
解决方法
只需创建另一个存储桶(或重命名实际的存储桶可能起作用)并复制所有命名为:
的内容sponsors-matchxperience
神奇的是,它在 Heroku 上的生产环境中运行良好。我不知道 AWS 文档发生了什么,但对我来说,错误是什么,我存储桶名称中的句点 .
。
我希望它对其他人有用。