I locate my redmine webite on dreamhost shared-host. It works well in the first 8 months. But recently I meet 404 Page not found frequently when I post a topic in the forum, or create new issues. This weekend I decide to dig the bug.
The problem looks like this in redmine/log/production.log
Processing IssuesController # create (for 999.999.999.99 at 2011-07-09 08:38:36) [POST] Parameters: { " commit " => " 创建 " , " project_id " => " test " , " action " => " create " , " authenticity_token " => " JOLhksjiN1Wmpt4iAVrw22Y+9+Pvdn1Kr6RwMQ3xDac= " , " issue " => { " start_date " => " 2011-07-09 " , " estimated_hours " => "" , " priority_id " => " 4 " , " parent_issue_id " => "" , " assigned_to_id " => "" , " subject " => " performance test " , " tracker_id " => " 1 " , " due_date " => "" , " status_id " => " 1 " , " description " => " 12313 " }, " controller " => " issues " , " attachments " => { " 1 " => { " description " => "" }}} Sending email notification to: Redirected to http: // project.cocos2d - x.com / issues / 62 Completed in 674ms (DB: 408 ) | 302 Found [http: // project.cocos2d - x.com / projects / test / issues] Processing ApplicationController # index (for 125.77.152.242 at 2011-07-09 08:38:37) [GET] ActionController::RoutingError (No route matches " /internal_error.html " with {:method => :get}): / dh / passenger / lib / phusion_passenger / rack / request_handler.rb: 92 : in `process_request ' / dh / passenger / lib / phusion_passenger / abstract_request_handler.rb: 207 : in `main_loop ' / dh / passenger / lib / phusion_passenger / railz / application_spawner.rb: 400 : in `start_request_handler ' / dh / passenger / lib / phusion_passenger / railz / application_spawner.rb: 351 : in `handle_spawn_application ' / dh / passenger / lib / phusion_passenger / utils.rb: 184 : in `safe_fork ' / dh / passenger / lib / phusion_passenger / railz / application_spawner.rb: 349 : in `handle_spawn_application ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 352 : in ` __send__ ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 352 : in `main_loop ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 196 : in `start_synchronously ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 163 : in `start ' / dh / passenger / lib / phusion_passenger / railz / application_spawner.rb: 209 : in `start ' / dh / passenger / lib / phusion_passenger / spawn_manager.rb: 262 : in `spawn_rails_application ' / dh / passenger / lib / phusion_passenger / abstract_server_collection.rb: 126 : in `lookup_or_add ' / dh / passenger / lib / phusion_passenger / spawn_manager.rb: 256 : in `spawn_rails_application ' / dh / passenger / lib / phusion_passenger / abstract_server_collection.rb: 80 : in `synchronize ' / dh / passenger / lib / phusion_passenger / abstract_server_collection.rb: 79 : in `synchronize ' / dh / passenger / lib / phusion_passenger / spawn_manager.rb: 255 : in `spawn_rails_application ' / dh / passenger / lib / phusion_passenger / spawn_manager.rb: 154 : in `spawn_application ' / dh / passenger / lib / phusion_passenger / spawn_manager.rb: 287 : in `handle_spawn_application ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 352 : in ` __send__ ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 352 : in `main_loop ' / dh / passenger / lib / phusion_passenger / abstract_server.rb: 196 : in `start_synchronously ' Rendering / home / walzer / project.cocos2d - x.com / public / 404 .html ( 404 Not Found) Processing IssuesController # show (for 999.999.999.99 at 2011-07-09 08:38:49) [GET] Parameters: { " action " => " show " , " id " => " 62 " , " controller " => " issues " } Rendering template within layouts / base Rendering issues / show.rhtml Completed in 831ms (View: 312 , DB: 484 ) | 200 OK [http: // project.cocos2d - x.com / issues / 62 ]
In the first paragraph, I create an issue. After that the passenger raise an "internal_error", and would like to find public/internal_error.html. Of course this file isn't exist, it's redmine/public/500.html instead. So I get a 404 error, public/404.html is rendered. In the 3rd paragraph, I refresh the page, and get the issue detail page correctly.
I contact the tech support of dreamhost, but the guy refuse to support problems of redmine. damn... I google this problem, many others met it but have no solutions given in their topics, such as
http://discussion.dreamhost.com/thread-130022.html (The tech support of dreamhost is just so so..)
http://groups.google.com/group/phusion-passenger/browse_thread/thread/c04394c2bf8440f6
http://railsforum.com/viewtopic.php?id=36826 (not completely the same)
They're the motion of writing this blog :)
OK, I must DIY now. I know almost nothing about rails, haha. So the breaking point is the 404 page.
1. copy 500.html to internal_error.html to avoid 400 error
After this step, the log looks correctly, but I get a internal_error.html rendered. Actually, I wish it still tell me something more about this error.
Processing MessagesController # new (for 999.999.999.99 at 2011-07-10 01:47:29) [POST] Parameters: { " board_id " => " 11 " , " commit " => " Create " , " action " => " new " , " authenticity_token " => " +KpHpWkhr/4pJQ4tyOgkxtV/CE8tq05r8EM605DLiJE= " , " controller " => " messages " , " message " => { " subject " => " Another test topic " , " content " => " go away 500! damn! " , " sticky " => " 0 " , " locked " => " 0 " }, " attachments " => { " 1 " => { " description " => "" }}} Sending email notification to: xxxx@cocos2d - x.org, yyyy@tranzda.com, zzz@cocos2d - x.org, aaa@cocos2d - x.org, bbbb@cocos2d - x.org, ccccc@gmail.com Redirected to http: // www.cocos2d - x.org / boards / 11 / topics / 2290 Completed in 2148ms (DB: 38 ) | 302 Found [http: // www.cocos2d - x.org / boards / 11 / topics / new] Processing MessagesController # show (for 999.999.999.99 at 2011-07-10 01:47:34) [GET] Parameters: { " board_id " => " 11 " , " action " => " show " , " id " => " 2290 " , " controller " => " messages " } Rendering template within layouts / base Rendering messages / show Completed in 106ms (View: 72 , DB: 20 ) | 200 OK [http: // www.cocos2d - x.org / boards / 11 / topics / 2290 ]
I can simply click refresh to get the right page. Why not do it automatically?
2. add this code into the header of redmine/public/internal_error.html
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > < head > < META HTTP-EQUIV ="refresh" CONTENT ="0" > </ head > < html > < title > Redirect </ title > < body > < h1 > I can not wait to refresh... </ h1 > < form > < input type ="button" onClick ="history.go(0)" value ="Refresh" > </ form > </ body > </html>
Oh nice, when the passenger raises 500 error, it will not invoke public/500.html, but call my custom public/internal_error.html, and refresh to the right page immediately.
It's nothing but a small trick. I hope it can help others who meet the same problem :)
本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2011/07/10/2102435.html,如需转载请自行联系原作者