丢失映像文件时出现内部服务器错误500(Rails 3.2.12)

问题描述:

如果我们请求伪造镜像文件,Rails会生成内部500服务器错误而不是404。请参阅下面的日志。丢失映像文件时出现内部服务器错误500(Rails 3.2.12)

这里是routes.rb中映入404行:

# Catches all 404 errors and redirects 
match '*url' => 'default#error_404' 

其他未知的URL与404正确处理。带有文件扩展名的图像文件和网址有什么不同?

Started GET "/images/doesnotexistyo.png" for 71.198.44.101 at 2013-03-08 07:59:24 +0300 
Processing by DefaultController#error_404 as PNG 
    Parameters: {"url"=>"images/doesnotexistyo"} 
Completed 500 Internal Server Error in 1ms 

ActionView::MissingTemplate (Missing template default/error_404, application/error_404 with {:locale=>[:en], :formats=>[:png], :handlers=>[:erb, :builder]}. Searched in: 
    * "/home/prod/Prod/app/views" 

的问题是,Default控制器内的error_404方法无法处理PNG格式的请求。当你问说,一个JSON响应,你可以建立类似的网址:

/controller/action.json 

和动作里,你会碰到这样的

def action 
    respond_to do |format| 
    format.html # Renders the default view 
    format.json { render :json => @model } 
    format.xml { render :xml => @model } 
    end 
end 

正如你所看到的,它规定如何处理JSON和XML请求,但由于没有format.png,因此该操作无法处理.png格式。补充一点:

format.png # Handle the request here... 

希望它能帮助:)

编辑

添加这重定向到您的404处理器:

def error_404 
    respond_to do |format| 
    format.html 
    format.png { redirect_to :controller => 'default', :action => 'error_404' } 
    end 
end 

干杯:)

编辑2

使用此代码来捕获所有类型的请求:

def error_404 
    respond_to do |format| 
    format.html { render :not_found_view } 
    format.all { redirect_to controller: 'default', action: 'error_404' } 
    end 
end 

替换:not_found_view与404页。这将呈现html请求的404页面,并将其重定向到self(使用html格式)以用于任何其他类型的请求。

希望它能帮助:)

+0

谢谢!如果它不是HTML格式,我们可以强制它呈现HTML视图并显示正确的404页面吗? – Crashalot 2013-03-08 20:30:53

+0

编辑我的答案,希望它有帮助:D – sergelerator 2013-03-08 22:26:38

+0

我们如何设置一个全面的?换句话说,如果我们想要捕获任何文件扩展名(例如.jpg,.gif)而不单独指定每个文件扩展名,我们将如何处理它? – Crashalot 2013-03-11 03:56:58

什么是DefaultController?该控制器是处理404,而不是Rails的默认响应:

ActionController::RoutingError (No route matches [GET] "/images/doesnotexistyo.png"): 

因此,找出该控制器,正在执行error_404并没有模板默认/ error_404被发现,因此500错误。

你可能有类似这样的地方在你的代码的代码:

rescue_from ActiveRecord::RecordNotFound, :with => :error_404 
+0

我们用路线中的一条线更新了q。rb,它捕获了404。问题是为什么它对一些URL有效,而不是对文件扩展名(特别是图像)有效? – Crashalot 2013-03-08 19:45:35

+0

方法error_404的内容是什么?该方法到达了最后,并试图用erb或builder渲染视图,使用提供的格式:png。除非你有一个error_404.png.erb或error_404.png.builder,否则你会看到这个错误的方式现在应用程序的设置。 – Leito 2013-03-08 19:48:53

+0

啊,我明白了。在3.2.12中处理这个问题的正确方法是什么?回答你的问题,error_404是一个空的行为,只是呈现相应的.html.erb视图。 – Crashalot 2013-03-08 19:54:44

也许不适合你,但因为我在我的控制器动态网页一些最后的检查,我只是按照我的所有404'ing一个处理非HTML文件:

format.all { render :status => 404, :nothing => true }