Zum Thema: FWIW, habe ich dieses Problem gerade auch angegangen. Manche finden den vollständigen Code hilfreich, da ich mehr als das, was du gepostet hast, benötigt habe:
# lib/proxy_to_other.rb
class ProxyToOther < Rack::Proxy
def initialize(app)
@app = app
end
def call(env)
original_host = env["HTTP_HOST"]
rewrite_env(env)
if env["HTTP_HOST"] != original_host
perform_request(env)
else
# nur normal
@app.call(env)
end
end
def rewrite_env(env)
request = Rack::Request.new(env)
if request.path =~ %r{^/prefix|^/other_prefix}
# nichts tun
else
env["HTTP_HOST"] = "localhost:3000"
end
env
end
end
Außerdem:
# config/application.rb
# ...Ausschnitt...
module MyApplication
class Application < Rails::Application
# Eigene Rack-Middlewares
config.middleware.use "ProxyToOther" if ["development", "test"].include? Rails.env
#...Ausschnitt...
Dies setzt voraus, dass deine App, zu der du einige Anfragen weiterleiten möchtest, auf Port 3001 läuft. Ich würde sagen, die App, die du angreifst, kann auf jedem Port ausgeführt werden. Das setzt auch voraus, dass du das Weiterleiten nur in Entwicklungs- und Testumgebungen machen möchtest, da du in Produktions- und Staging-Umgebungen eine "echte" Lösung haben wirst (z.B. nginx oder ein Lastenausgleicher, der die richtigen Dinge macht).