www.Walzer.cn - Tech & Management Blog

Focus on mobile dev
本博客文章,未在标题中写明转载的, 均为原创.
所谓高手,也就是熟悉别人制定的游戏规则、并且能在规则内跳舞的人。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

A small trick to avoid 404 error when redmine runs on dreamhost

Posted on 2011-07-10 17:47  Walzer  阅读(1472)  评论(0编辑  收藏  举报

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 :)