问题
My rails application works fine locally, and seems to deploy normally. The root route brings you to my welcome splash page. I have a link on that page to the index for my organizations model, generated by the following code:
<%= link_to("Organizations", organizations_path, :class => "button_blue") %>
When I try to click that link on the production server, hosted by a2 hosting, I get the following error:
Started GET "/database/organizations.shtml" for 11.222.33.444 at Sat Oct 05 00:10:35 -0400 2013
ActionController::RoutingError (No route matches [GET] "/database/organizations.shtml"):
actionpack (3.2.13) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
...
Why is it trying to get "/database/organizations" instead of "/organizations" like it does in development? The url in the address bar reads "http://database.mysite.com/organizations". Does it have something to do with the fact that the site is located at the subdomain database.mysite.com? How do I get around this, since I can't use the primary domain for my rails app?
For what it's worth, here's what I get when I run
RAILS_ENV=production bundle exec rake routes | grep organization
on the server:
organizations GET /organizations(.:format) organizations#index
POST /organizations(.:format) organizations#create
new_organization GET /organizations/new(.:format) organizations#new
edit_organization GET /organizations/:id/edit(.:format) organizations#edit
organization GET /organizations/:id(.:format) organizations#show
PUT /organizations/:id(.:format) organizations#update
DELETE /organizations/:id(.:format) organizations#destroy
Here is my routes.rb:
MyApp::Application.routes.draw do
root :to => 'application#index'
resources :grantmakers, :grant_records, :events, :organizations
end
Here is my config/environments/production.rb:
MyApp::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# Code is not reloaded between requests
config.cache_classes = true
# Full error reports are disabled and caching is turned on
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = true
# Generate digests for assets URLs
config.assets.digest = true
# Defaults to nil and saved in location specified by config.assets.prefix
# config.assets.manifest = YOUR_PATH
# Specifies the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
# config.force_ssl = true
# See everything in the log (default is :info)
# config.log_level = :debug
# Prepend all log lines with the following tags
# config.log_tags = [ :subdomain, :uuid ]
# Use a different logger for distributed setups
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
# Use a different cache store in production
# config.cache_store = :mem_cache_store
# Enable serving of images, stylesheets, and JavaScripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
# config.assets.precompile += %w( search.js )
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
# config.active_record.auto_explain_threshold_in_seconds = 0.5
end
And here is my application_controller.rb:
class ApplicationController < ActionController::Base
protect_from_forgery
def index
end
before_filter :basic_http_authentication
private
def basic_http_authentication
if Rails.env.production?
authenticate_or_request_with_http_basic do |username, password|
username == '---' && password == '---'
end
end
end
end
Thanks very much for your help.
回答1:
Thanks to @phoet, I finally identified the problem and found a solution.
My Apache server was rewriting the URLs for some reason that I still don't understand. I think it might have to do with the way A2 hosting allows you to set up subdomains. In any case, adding the following line to the end of the .htaccess file in the subdomain's root directory solved the problem:
RewriteEngine Off
This simply disables all rewriting: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteengine
来源:https://stackoverflow.com/questions/19193943/extra-directory-prepended-to-my-routes-in-production