2010-06-10 17 views
5

मेरे पास एक रेल एप्लिकेशन सर्वर है जो पोर्ट 9000 पर सुन रहा है, और हैप्रोक्सी के माध्यम से बुलाया जा रहा है। उस सर्वर से मेरे सभी रीडायरेक्ट को पोर्ट 9000 के माध्यम से वापस रीडायरेक्ट किया जा रहा है, जब उन्हें पोर्ट 80 पर वापस भेजा जाना चाहिए।विशिष्ट बंदरगाहों को रीडायरेक्ट भेजें

मैं हैप्रोक्सी + nginx + यात्री का संयोजन उपयोग कर रहा हूं। क्या यह सुनिश्चित करने का कोई तरीका है कि सभी रीडायरेक्ट पोर्ट 80 के माध्यम से भेजे जा रहे हैं, भले ही वास्तविक सर्वर किस पोर्ट पर सुन रहा हो?

मुझे कोई परवाह नहीं है कि यह एक हैपरॉक्स, nginx, यात्री, या रेल बदलता है। मुझे बस यह सुनिश्चित करने की ज़रूरत है कि अन्यथा निर्दिष्ट किए जाने तक अधिकांश अनुरोध पोर्ट 80 पर वापस भेजे जाते हैं।

धन्यवाद!

+0

पोर्ट 9000 पर क्या चल रहा है? हैप्रोक्सी डेमॉन या nginx, और आप haproxy और nginx का उपयोग क्यों करते हैं? – jigfox

+0

हैप्रोक्सी डिमन पोर्ट 80 पर है, और मेरे पास विभिन्न प्रकार के बंदरगाहों पर चल रहे nginx उदाहरण हैं। – Garrett

उत्तर

11

elektronaut की तरह संकेत दिया, यह शायद कुछ है जो आपके प्रॉक्सी की कॉन्फ़िगरेशन में संभाला जाना चाहिए। उस ने कहा, ActiveSupport :: UrlFor # url_for में कुछ जानकारी है जो उपयोगी हो सकती है। http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

पर एक नज़र डालें जो मुझे लगता है कि यह आपके url_for और/या link_to कॉल में दो तर्क पारित करने के लिए उबलता है।

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

और एक कस्टम बनाते समय: पहले :port => 123 तर्क है, दूसरा :only_path => false इतना है कि यह डोमेन, बंदरगाह सहित पूरा लिंक उत्पन्न करता है, आदि

तो जब एक लिंक पैदा करने के लिए, आप कर सकते हैं है यूआरएल आप क्या कर सकते हैं:

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

एक रीडायरेक्ट के लिए:

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

मुझे आशा है कि इससे मदद मिलती है, और यदि ऐसा नहीं होता है, तो आप अपने यूआरएल कैसे उत्पन्न कर सकते हैं, आपके लिए कौन सी रेलियां उत्पन्न हो रही हैं, और आप इसे उत्पन्न करना चाहते हैं।

अद्यतन: मैं इस बारे में पता नहीं था, लेकिन यह आप यूआरएल रेल के लिए चूक url_for है, जो सब कुछ है कि लिंक और/या URL उत्पन्न करता है के द्वारा प्रयोग किया जाता है के साथ उत्पन्न करता है निर्धारित कर सकते हैं लगता है।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 

इसके बारे में एक अच्छा लिखने अप यहाँ है पहले ब्लॉक नियंत्रकों में डिफ़ॉल्ट सेट सेट करता है, दूसरा यूआरएल_for हेल्पर को नियंत्रकों में पाए गए एक का उपयोग करने का कारण बनता है, इसलिए डिफ़ॉल्ट भी उस पर लागू होते हैं।

+0

मुझे अभी url_for के लिए डिफ़ॉल्ट सेट करने के बारे में पता चला है। मैंने इस पोस्ट को सभी जानकारी के साथ अपडेट किया है। यह एक बहुत साफ समाधान है। –

2

रीडायरेक्ट नए सिरे से लिखना शायद वेब सर्वर की जिम्मेदारी होनी चाहिए, लेकिन आप अनुरोध वस्तु हैक कर सकते हैं हमेशा पोर्ट 80 वापस जाने के लिए एक 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

यह काम कर सकता है, लेकिन यह एक विशाल स्लेज हथौड़ा के साथ एक छोटी सी नाखून ड्राइविंग की तरह लगता है। मुझे यह भी आश्चर्य है कि आपके द्वारा दिखाए गए पोर्ट विधि को ओवरराइड करने के लिए अन्य दुष्प्रभाव हो सकते हैं या नहीं। –

0

इस लिंक है कि के रूप में एक ही सर्वर से जुड़े होते हैं कर रहे हैं वे साइट पर साइट पर हैं। आप पूर्ण लोगों के बजाय सापेक्ष लिंक का उपयोग कर सकते हैं। यदि आप लिंक बनाने के लिए सहायक विधियों का उपयोग कर रहे हैं तो आप _url के बजाय _path प्रत्यय का उपयोग कर सकते हैं।

अपने routes.rb कुछ इस तरह दिखाई देता है:

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

या रेल 3 में:

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 

:

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

आप रिश्तेदार लिंक बनाने के लिए निम्नलिखित सहायक तरीकों का उपयोग कर सकते हैं जैसा कि आप देख सकते हैं, ये लिंक उस पोर्ट या होस्ट से स्वतंत्र हैं जो आप चल रहे हैं।

+0

मुझे '_url' की आवश्यकता है क्योंकि मैं ओपनआईडी को रीडायरेक्ट करने के लिए एक यूआरएल उत्पन्न कर रहा हूं। एक बार रीडायरेक्ट समाप्त होने के बाद, सर्वर पोर्ट पर सोच रहा है: 9 000। मेरे पास जेनरेट किए गए यूआरएल पर ज्यादा नियंत्रण नहीं है। – Garrett

1

मैं प्रस्तावित करता हूं कि यह कोड को कॉन्फ़िगरेशन में जोड़कर हैप्रोक्सी में तय किया जाना चाहिए।

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

बेशक यदि आप कई nginx/रेल बंदरगाहों का उपयोग कर रहे हैं तो आपको मल्टीपाइल प्रविष्टियों की आवश्यकता हो सकती है। – thomasfedb

+0

यह कहां जाता है? बैकएंड ब्लॉक या फ्रंटेंड ब्लॉक के भीतर? – Garrett

+0

मैं haproxy मैनुअल से ज्यादा क्या कह सकता हूं (ज्यादा नहीं) यह बैकएंड में जाना चाहिए। लेकिन अगर उसके पास समस्या है तो आगे बढ़ने का प्रयास करें। – thomasfedb

संबंधित मुद्दे