在Herails的Rails中将子目录中的URL重写为子域

时间:2014-09-15 10:41:12

标签: ruby-on-rails wordpress mod-rewrite heroku rack-rewrite

我试图改写:

mysite.com/blog 转到 blog.mysite.com

要明确:我只希望用户看到 mysite.com/blog 。博客实际上是blog.mysite.com上单独托管的wordpress网站。而mysite.com是一个Rails应用程序。

我尝试使用rack-rewrite来实现这一点,我可以使用301重定向,但不能重写。

config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
  #r301   '/blog',  'http://blog.mysite.com' #works
  rewrite   '/blog',  'http://blog.mysite.com' #fails
end

我试图在Rails中而不是在Web服务器中执行此操作的原因是因为我使用Heroku进行托管,我相信不可能在Heroku上配置这种类型的重写。

所以我的问题很简单,我怎样才能实现这种重写?

P.S。我看到另一篇文章建议使用rack-reverse-proxy,但这个宝石看起来很古老,似乎没有太大的发展。这使我对使用它感到紧张。

2 个答案:

答案 0 :(得分:2)

在没有替代解决方案的情况下,我放弃了我的预订并使用了rack-reverse-proxy宝石。正如其他一些帖子所建议的那样(SO不允许我链接到这里)。

它对我来说很好(Ruby 1.9.3,Rails 3.2.12)。

我的代码是:

use Rack::ReverseProxy do
   reverse_proxy /^\/blog(\/.*)$/, 'http://blog.example.com$1', opts={:preserve_host => true} #works
end

在config.ru文件的底部。

注意:在Wordpress中,我还需要更改设置中的网站网址>一般。我将其更改为:http://example.com/blog但我保持.htaccess文件不变。

最后一点:我所有的CSS和JS都被引用了,但是我的本地字体不是。我通过引用rails应用程序的assets目录中的字体解决了这个问题(而不是我的Wordpress主题)。

答案 1 :(得分:1)

听起来您的博客和您的网站托管在不同的地方。

重写仅在您想要提供相同的rails页面但来自不同的URL时才有效。它不适用于不同的主机: https://github.com/jtrupiano/rack-rewrite#rewrite

最好的解决方案是将用户重定向到子域名。

其他一些不太理想的选择:

  • 在rails应用中使用您的博客的iFrame(这使得很难导航和添加书签)
  • 使用诸如rack-reverse-proxy之类的东西从您的rails应用程序提供您的博客(这对用户来说会很慢并且会减慢您网站的其余部分)。
  • 加载Rails页面后,通过JavaScript加载您的博客(搜索引擎优化不太好,可能很难导航)

所以,我建议只使用子域名。