如果我们请求伪造图像文件,Rails会生成内部500服务器错误而不是404.请参阅下面的日志。
以下是 routes.rb 中捕获404s的行:
# Catches all 404 errors and redirects
match '*url' => 'default#error_404'
使用404正确处理其他未知网址。具有文件扩展名的图像文件和URL有何不同?
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"
答案 0 :(得分:4)
问题是error_404
控制器内的Default
方法无法处理png格式的请求。当您要求说出JSON响应时,您可以构建类似于以下的URL:
/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
干杯:)
<强> EDIT2 强>
使用此代码捕获各种请求:
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格式)。
希望有所帮助:)
答案 1 :(得分:0)
什么是DefaultController
?该控制器正在处理404,而不是Rails默认响应:
ActionController::RoutingError (No route matches [GET] "/images/doesnotexistyo.png"):
因此找出这个控制器,正在执行error_404并且没有找到模板默认/ error_404,因此出现500错误。
您的代码中可能有一个与此类似的代码:
rescue_from ActiveRecord::RecordNotFound, :with => :error_404
答案 2 :(得分:0)
也许不适合你,但是因为我在我的控制器中动态地对页面进行了一些最终检查,所以我只需按照我的所有404来处理非html文件:
format.all { render :status => 404, :nothing => true }