Extra directory prepended to my routes in producti

2019-07-28 23:45发布

问题:

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