我想创建一个用于部署 heroku 的机架应用程序,以创建一些到其他子域的 301 重定向。
如果这条路能延续下去,那就太好了。
我从以下代码开始,但它不起作用:
require 'rack-force_domain'
use Rack::ForceDomain, ENV["DOMAIN"]
run lambda { |env| [200, {'Content-Type'=>'text/plain'}, StringIO.new("Hello World!\n")] }
我想创建一个用于部署 heroku 的机架应用程序,以创建一些到其他子域的 301 重定向。
如果这条路能延续下去,那就太好了。
我从以下代码开始,但它不起作用:
require 'rack-force_domain'
use Rack::ForceDomain, ENV["DOMAIN"]
run lambda { |env| [200, {'Content-Type'=>'text/plain'}, StringIO.new("Hello World!\n")] }
我通过使用sinatra
finally 解决了这个问题。那是我的config.ru
:
require 'sinatra'
get %r{(.*)} do
redirect to("http://custom.domain#{params[:captures].first}"), 301
end
run Sinatra::Application
只是这样做,它非常简单:
宝石文件:
source 'https://rubygems.org'
ruby '2.0.0'
gem 'rack'
gem 'rack-rewrite'
配置.ru:
require 'rack/rewrite'
use Rack::Rewrite do
...
end
run lambda { |env| [200, {'Content-Type'=>'text/plain'}, StringIO.new("Nothing Here!\n")] }
任何与您的重定向规则不匹配的内容都只会返回 200 并带有文本“Nothing Here!”。
看看 rack-rewrite - https://github.com/jtrupiano/rack-rewrite,它有一个你想要实现的例子。
我稍微调整了@rriemann 的答案。我发现我希望重定向完整路径,包括参数。另外,插入用户提供的字符串不是很危险吗?这对我有用:
require 'sinatra'
get "*" do
redirect to("http://custom.domain" + request.fullpath), 301
end
run Sinatra::Application
此外,如果有人需要,这里是我的实现的github 链接。