尝试访问损坏的图片 url 时抛出内部服务器错误 500 而不是 404

Posted

技术标签:

【中文标题】尝试访问损坏的图片 url 时抛出内部服务器错误 500 而不是 404【英文标题】:Internal Server Error 500 gets thrown instead of 404 while trying to access broken picture urls 【发布时间】:2012-05-04 01:45:37 【问题描述】:

我们有一个带有自定义 404 和 500 页设置的 Rails 服务器,使用这里的教程:

http://ramblinglabs.com/blog/2012/01/rails-3-1-adding-custom-404-and-500-error-pages

虽然它运行良好并且对各种路径抛出 404,但在尝试访问任何类型的后缀路径(如 en/foo.png、en/foo.pdf、en/foo.xml、 ...

但是像 en/file.foo 这样的东西会抛出 404。所以只有有效的后缀会抛出 500。

路线结束.rb:

if Rails.application.config.consider_all_requests_local
  match '*not_found', to: 'errors#error_404'
end

application_controller.rb

  unless Rails.application.config.consider_all_requests_local
    rescue_from Exception, with: :render_500
    rescue_from ActionController::RoutingError, with: :render_404
    rescue_from ActionController::UnknownController, with: :render_404
    rescue_from ::AbstractController::ActionNotFound, with: :render_404
    rescue_from ActiveRecord::RecordNotFound, with: :render_404
  end

  protected

  def render_404(exception)
    @not_found_path = exception.message
    respond_to do |format|
      format.html  render template: 'errors/error_404', layout: 'layouts/application', status: 404 
      format.all  render nothing: true, status: 404 
    end
  end

  def render_500(exception)
    logger.fatal(exception)
    respond_to do |format|
      format.html  render template: 'errors/error_500', layout: 'layouts/application', status: 500 
      format.all  render nothing: true, status: 500
    end
  end

出现的 500 个:

Missing template errors/error_404 with :locale=>[:de, :en], :formats=>[:png], :handlers=>[:erb, :builder, :coffee, :arb, :haml]

【问题讨论】:

你能分享你的routes.rb文件和相关的控制器代码吗? 【参考方案1】:

尝试添加

respond_to :html, :json, :png

以及控制器顶部的任何其他必要格式。如果我是对的,那么问题在于单个控制器操作中的format.all 未设置为将:png 作为它响应的格式之一。

您可能还需要将以下定义和任何类似定义添加到您的 config/environment.rb

Mime::Type.register "image/png", :png

查看更多详情here。基本上,您需要设置要响应的 mime 类型。错误信息表明 rails 不理解如何渲染格式png

【讨论】:

非常感谢。但这不是问题!【参考方案2】:

我们发现了错误。

我们有一个包含以下内容的 error_controller.rb:

  def error_404
    @not_found_path = params[:not_found]
    render template: 'errors/error_404', layout: 'layouts/application', status: 404
  end

我们将其更改为:

  def error_404
    @not_found_path = params[:not_found]
    respond_to do |format|
      format.html  render template: 'errors/error_404', layout: 'layouts/application', status: 404 
      format.all  render nothing: true, status: 404 
    end
  end

【讨论】:

我将在博文底部添加一条注释,考虑到这一点。

以上是关于尝试访问损坏的图片 url 时抛出内部服务器错误 500 而不是 404的主要内容,如果未能解决你的问题,请参考以下文章

从节点 jdbc 访问 Redshift 数据时抛出错误

Apache mod_wsgi 在部署 Django 项目时抛出错误“403 Forbidden”

在函数内部发生错误时抛出异常

strconv.Atoi() 给定字符串时抛出错误

useEffect 用于设置输入值时抛出错误

ALAsset 指针在访问时抛出 EXC_BAD_ACCESS