ruby-on-rails - 如何使用 Rails/Puma 为 404 Not found 页面设置 HTTP 标头
问题描述
我需要为在我的 rails 应用程序X-Frame-Options
中返回的页面设置 HTTP 标头,404 - Not Found
但我不知道该怎么做。我无法使用 rails 设置这些标题,我在这里找到了一个可能的原因。但是,我也不知道如何使用 Web 服务器设置它们,我使用的是 Puma。
ClickJacked
我的页面中实际上没有任何内容,404 - not found
但外部安全组织仍然要求我这样做。
解决方案
在 Rails 中,异常由config.exceptions_app
. 默认应用程序仅呈现来自公共目录的静态 html 文件,但这可以是任何机架兼容的应用程序。
机架兼容应用程序的最基本示例是:
app = ->(env){ [ 404, { "Content-Type" => "text/plain", "X-Frame-Options" => "some value" }, ["Oh no I cant find it!"] ] }
它接受一个参数(哈希)并返回一个数组(状态、标题、正文)。
Rails 路由和ActionController::Metal
(以及所有你的控制器)都是机架兼容的应用程序,甚至config/application.rb
. 事实上,Rails 只是 Rack 应用程序的俄罗斯娃娃方案。
如果您想通过您的路线处理此问题,您可以执行以下操作:
# config/application.rb
config.exceptions_app = self.routes
# config/routes.rb
get '/404', to: "errors#not_found"
get '/422', to: "errors#unprocessable_entity"
get '/500', to: "errors#internal_error"
class ErrorsController < ActionController::Base
before_action do
response.set_header('X-Frame-Options', 'HEADER VALUE')
end
def not_found
respond_to do |format|
format.html { render file: Rails.root.join('public', '404.html'), layout: false, status: :not_found }
end
end
def unprocessable_entity
respond_to do |format|
format.html { render file: Rails.root.join('public', '422.html'), layout: false, status: :unprocessable_entity }
end
end
def internal_error
respond_to do |format|
format.html { render file: Rails.root.join('public', '500.html'), layout: false, status: :internal_server_error }
end
end
end
推荐阅读
- python - 树莓派 3、OpenCV 和 Picamera
- spring - Spring Boot 2 跨页面国际化
- javascript - 变干了,现在我的代码在 Javascript 中出现了意外的行为
- firebase - 使用 Firebase,我可以跟踪使用夜间模式与日间模式的用户百分比吗?
- regex - `[][]` 如何匹配“[或]”?
- java - 带有 OR AND 运算符的字段表达式验证 Struts 2
- .net - .Net Core Web 应用程序部署到带有服务器错误的 IIS
- javascript - 如何通过 javascript 为 css 代码运行这段代码
- php - 在一个控制器中使用 2 个模型是不好的做法
- primefaces - p:dataTable 粘性标题和带有 position:sticky 的自定义 div 标题相互重复