5

ポート9000でリッスンしているRailsアプリケーションサーバーがあり、haproxyを介して呼び出されています。そのサーバーからのすべてのリダイレクトは、ポート8000​​を介してリダイレクトされますが、ポート80で送り返される必要があります。

私はhaproxy+nginx+passengerの組み合わせを使用しています。実際のサーバーがリッスンしているポートに関係なく、すべてのリダイレクトがポート80を介して送信されていることを確認する方法はありますか?

haproxy、nginx、Passenger、またはRailsが変更されてもかまいません。特に指定がない限り、ほとんどのリクエストがポート80に返送されることを確認する必要があります。

ありがとう!

4

4 に答える 4

12

elektronautが示したように、これはおそらくプロキシの構成で処理する必要があるものです。そうは言っても、ActiveSupport :: UrlFor#url_forには役立つ情報がいくつかあります。http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rbをご覧ください

つまり、url_forやlink_toの呼び出しに2つの引数を渡すことです。最初は:port => 123引数であり、2番目は:only_path => falseドメインやポートなどを含む完全なリンクを生成するためのものです。

したがって、リンクを生成するときは、次のようにします。

link_to 'test', root_url(:port => 80, :only_path => false)

カスタムURLを作成するときは、次のようにします。

url_for :controller => 'test', :action => 'index', :port => 80, :only_path => false

リダイレクトの場合:

redirect_to root_url(:port => 80, :only_path => false)

これがお役に立てば幸いです。そうでない場合は、URLの生成方法、レールが生成するもの、生成するものについて具体的に教えてください。

更新: 私はこれに気づいていませんでしたが、リンクやURLを生成する他のすべてのものによって使用されるurl_forでURL​​のrails生成のデフォルトを設定できるようです。ここにそれについての良い記事があります:http://lucastej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

またはあなたのためにそれを要約すると:

これをあなたに追加してくださいapplication_controler.rb

def default_url_options(options)
   { :only_path => false, :port => 80 }
end

この:

helper_method :url_for

最初のブロックはコントローラーにデフォルトを設定し、2番目のブロックはurl_forヘルパーがコントローラーにあるものを使用するようにするため、デフォルトはそれにも適用されます。

于 2010-06-19T08:17:18.670 に答える
2

リダイレクトの書き換えはおそらくWebサーバーの責任ですが、リクエストオブジェクトをハックして、before_filterで常にポート80を返すことができます。

class ApplicationController < ActionController::Base
    before_filter :use_port_80 if RAILS_ENV == production
    def use_port_80
        class << request
            def port; 80; end
        end
    end
end
于 2010-06-14T23:16:40.183 に答える
1

このコードを設定に追加することで、haproxyで修正する必要があることを提案します。

rsprep (.*):9000(.*) \1\2
于 2010-06-19T09:55:11.813 に答える
0

これがサイトと同じサーバーにリンクされているリンクである場合、それらが存在するサイト。絶対リンクの代わりに相対リンクを使用できます。ヘルパーメソッドを使用してリンクを作成している場合は、の_path代わりにサフィックスを使用できます_url

あなたroutes.rbがこのように見える場合:

ActionController::Routing::Routes.draw do |map|
  map.resources :users
end

またはレール3:

YourAppName::Application.routes.draw do
  resources :users
end

次のヘルパーメソッドを使用して、相対リンクを作成できます。

users_path     #=> /users
user_path      #=> /users/:id
edit_user_path #=> /users/:id/edit
new_user_path  #=> /users/new

# instead of

users_url      #=> http(s)://example.com:9000/users
user_url       #=> http(s)://example.com:9000/users/:id
edit_user_url  #=> http(s)://example.com:9000/users/:id/edit
new_user_url   #=> http(s)://example.com:9000/users/new

ご覧のとおり、これらのリンクは、実行しているポートまたはホストから独立しています。

于 2010-06-17T13:42:29.263 に答える