Search code examples
ruby-on-rails-3routespassengerapache-config

Phusion Passenger - route exists but is not matched (gives 404 instead)


I'm running a rails 3 app at the root level in a phusion passenger environment (CentOS, apache) and having difficulty getting passenger to find some routes, although rake routes shows the routes correctly. Everything works fine in development (i.e. using rails server instead of phusion passenger in apache).

I have an admin section to my app with a login page. The main part of the app works, but everything under the admin section is inaccessible because I get a 404 instead of the login page (when I disable login I can access the admin pages). My apache config is

<VirtualHost *:80>
  ServerName foo.bar.com
  DocumentRoot /var/www/apps/myapp/current/public
  <Directory /var/www/apps/myapp/current/public>
    Allow from all
    Options -MultiViews
  </Directory>
</VirtualHost>

My login process is implemented as a before_filter in an admin controller:

class Admin::AdminController < ApplicationController

  # login disabled for testing
  before_filter :require_login

  def require_login
    @current_user ||= User.find_by_id(session[:user_id])
    redirect_to admin_login_path unless @current_user
  end
end

My routes file has

Mpf::Application.routes.draw do
  secure_protocol = "https://"
  ...
  namespace "admin" do
    ...
    match "login" => "user_sessions#new", :as => :login, :constraints => { :protocol => secure_protocol }
    ...    
  end
  ...
end

and when I run rake routes I get

admin_login        /admin/login(.:format)      {:protocol=>"http://", :action=>"new", :controller=>"admin/user_sessions"}

BUT when I try to access http://foo.bar.com/admin I get a 404 and the log shows

Started GET "/admin/login" for iii.iii.iii.iii at 2011-07-13 07:20:41 -0400
ActionController::RoutingError (No route matches "/admin/login"):

As far as I can tell it should be working... except for the fact that it's not. Any help would be greatly appreciated!


Solution

  • Have you tried accessing with https://? It looks like you provided constraints to prevent access from http:// and the link you posted references http://.