2010-06-10 25 views
5

Tôi có một máy chủ ứng dụng Rails đang nghe trên cổng 9000 và đang được gọi thông qua haproxy. Tất cả các chuyển hướng của tôi từ máy chủ đó đang được chuyển hướng trở lại qua cổng 9000, khi chúng được gửi lại trên cổng 80.Gửi chuyển hướng đến các cổng cụ thể

Tôi đang sử dụng kết hợp haproxy + nginx + hành khách. Có cách nào để đảm bảo tất cả các chuyển hướng đang được gửi qua cổng 80, bất kể cổng nào máy chủ thực sự đang nghe?

Tôi không quan tâm nếu thay đổi haproxy, nginx, Hành khách hoặc Đường ray của nó thay đổi. Tôi chỉ cần đảm bảo hầu hết các yêu cầu trừ khi được chỉ định khác, được gửi lại đến cổng 80.

Cảm ơn!

+0

những gì đang chạy trên cổng 9000? haproxy deamon hoặc nginx, và tại sao bạn sử dụng haproxy và nginx? – jigfox

+0

Daemon haproxy nằm ở cổng 80 và tôi có các phiên bản nginx chạy trên nhiều cổng khác nhau. – Garrett

Trả lời

11

Giống như elektronaut đã cho biết, đây có lẽ là thứ cần xử lý trong cấu hình proxy của bạn. Điều đó nói rằng, ActiveSupport :: UrlFor # url_for có một số thông tin có thể hữu ích. Hãy xem http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

Những gì tôi nghĩ rằng nó sôi xuống để chuyển hai đối số vào url_for và/hoặc liên kết_to cuộc gọi của bạn. Đầu tiên là lập luận :port => 123, thứ hai là :only_path => false để nó tạo ra các liên kết đầy đủ bao gồm tên miền, cảng vv

Vì vậy, khi tạo ra một liên kết, bạn có thể làm:

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

và khi tạo ra một tùy chỉnh url bạn có thể làm:

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

Đối với một chuyển hướng:

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

Tôi hy vọng điều này sẽ hữu ích, và nếu không, bạn có thể cụ thể hơn về cách tạo URL của mình, những đường ray nào tạo ra cho bạn hay không và những gì bạn muốn tạo.

Cập nhật: Tôi đã không nhận thức được điều này, nhưng có vẻ như bạn có thể thiết lập mặc định cho đường ray của URL tạo với url_for, được sử dụng bởi mọi thứ khác mà tạo ra các liên kết và/hoặc URL.Có một ghi tốt lên về nó ở đây: http://lucastej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

Hoặc để tóm tắt cho bạn:

Thêm này để bạn application_controler.rb

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

và điều này:

helper_method :url_for 

Các bộ chặn đầu tiên đặt mặc định trong bộ điều khiển, thứ hai làm cho trình trợ giúp url_for sử dụng bộ tìm thấy trong bộ điều khiển, do đó các giá trị mặc định cũng áp dụng cho bộ điều khiển đó.

+0

Tôi vừa phát hiện ra về cài đặt mặc định cho url_for. Tôi đã cập nhật bài đăng này với tất cả thông tin. Đó là một giải pháp sạch hơn nhiều. –

2

Viết lại chuyển hướng có lẽ nên được trách nhiệm của máy chủ web, nhưng bạn có thể hack các đối tượng yêu cầu phải luôn luôn trở lại cổng 80 trong một before_filter:

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
+0

Điều này có thể hoạt động, nhưng nó cảm thấy giống như lái một chiếc đinh nhỏ bằng một cái búa tạ khổng lồ. Tôi cũng tự hỏi liệu có thể có các tác dụng phụ khác để ghi đè phương thức cổng như bạn đã chỉ ra hay không. –

0

Nếu đây là các liên kết có liên quan đến máy chủ giống như trang web mà họ đang truy cập. Bạn có thể sử dụng các liên kết tương đối thay vì các liên kết tuyệt đối. Nếu bạn đang sử dụng phương pháp trợ giúp để tạo liên kết, bạn có thể sử dụng hậu tố _path thay vì _url.

Nếu routes.rb của bạn trông giống như sau:

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

hoặc trong đường ray 3:

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

bạn có thể sử dụng các phương pháp helper sau để tạo liên kết tương đối:

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 

Như bạn có thể thấy, các liên kết này độc lập với cổng hoặc máy chủ mà bạn đang chạy.

+0

Tôi cần '_url' vì tôi đang tạo URL để chuyển hướng OpenID trở lại. Sau khi chuyển hướng kết thúc, máy chủ đang nghĩ về cổng của nó: 9000. Tôi cũng không có nhiều quyền kiểm soát đối với URL được tạo. – Garrett

1

Tôi đề xuất nó nên được sửa trong haproxy bằng cách thêm mã này vào cấu hình.

rsprep (.*):9000(.*) \1\2 
+0

Tất nhiên bạn có thể cần nhiều mục nhập nếu bạn đang sử dụng nhiều cổng nginx/rails. – thomasfedb

+0

Trường hợp chính xác đi đâu? Trong các khối phụ trợ hoặc khối giao diện người dùng? – Garrett

+0

Từ những gì tôi có thể nói từ hướng dẫn haproxy (không nhiều) điều này nên đi trong phụ trợ. Nhưng nếu điều đó có vấn đề thì hãy thử lối vào. – thomasfedb

Các vấn đề liên quan