如何使用子目录而不是子域名?

22
我正在构建一款Rails应用程序,我将在Heroku上托管它,域名为domain.com。我想使用WordPress来托管位于phpfog上的博客,但我不想使用像blog.domain.com这样的子域名。我更喜欢使用子目录,例如domain.com/blog。
这与SEO无关,我只是不喜欢子域名。子目录更性感(是的...我实际上说了那个词)。
有什么好的想法可以可靠地完成这个目标吗?提前感谢您的帮助。

我不知道是否可能,因为你不能在Heroku下托管WordPress。 - bbonamin
根据下面的答案以及我所做的一点研究,我认为最好是在我的应用程序中自己开发一个小型的Rails博客引擎。我看过“15分钟内构建博客”的Rails视频。我不想使用脚手架(我可能可以不用它)。我的应用程序本来就有一些博客的特点...文章、评论等等。不过,我需要设置某种用户权限,以便只有具有管理员帐户的人才能发布博客。 - Eddie
我非常推荐Ryan的railscasts给这个项目,他有一个带有博客的示例,因此有很多资源可以帮助你。http://railscasts.com - bbonamin
1
谢谢Bruno...我会去看看。目前正在阅读Michael Hartl的Ruby on Rails 3教程。 - Eddie
FYI,有一个名为Refinery CMS的Rails博客,它只有WordPress的四分之一强大 https://www.ruby-toolbox.com/projects/refinerycms。虽然不是WordPress,但它是一种本地解决方案。 - Chloe
4个回答

19

你可以使用neezter发现的rack-reverse-proxy gem来完成这个任务。首先,你需要在Gemfile中添加gem "rack-reverse-proxy", :require => "rack/reverse_proxy" 并运行bundle install。接下来,你需要修改你的config.ru文件来将/blog/路由转发到你想要的博客地址:

require ::File.expand_path('../config/environment',  __FILE__)

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

run YourAppName::Application

你可能已经拥有了第一个require语句和run YourAppName...语句。这里有一些重要的细节需要注意。

首先,当你添加所需博客的URL时,不能保留它的尾部斜线。如果保留了,当有人请求http://yourdomain.com/blog/时,gem会将他们转发到http://you.yourbloghost.com//,并多出一个尾部斜线。

其次,如果未启用:preserve_host选项,你的博客托管服务器将把请求视为对http://yourdomain.com/blog/的请求,而不是http://you.yourbloghost.com,并返回错误结果。

如果博客使用/absolute/paths/to/images/,你仍然可能会遇到CSS或图像问题。


你如何处理Tumblr使用绝对URL链接到包含主机名的内容这一事实? - Chris Nicola
Chris,恐怕我没有一个很好的解决方案。我使用的是WordPress,在其中可以手动指定页面内容中将使用的基本路径,因此我不需要处理这个问题。如果你想深入定制rack-reverse-proxy的源代码,你可以修改它,使其编辑Tumblr返回的HTML。 - jplewicke
是的,我一直在尝试着弄清楚如何做到那一点。我考虑过使用一些正则表达式替换,但从文档中并不清楚应该如何实现。 - Chris Nicola
2
如果你想捕获/blog(不带尾随斜杠) reverse_proxy /^/blog(/?.*)$/, 'http://notch.tumblr.com$1', opts={:preserve_host => true} - micred
这个很好用 - 你如何更改WordPress的设置,使CSS仍然有效? - Ryan Perera
我解决了这个问题 - 这是一个HTTPS问题,通过添加WordPress SSL解决了。 - Ryan Perera

3
我认为你最好的选择是尝试使用Rack中间件进行反向代理(类似于Apache的mod_proxy)。 一个快速的谷歌搜索揭示了这个宝石(https://github.com/jaswope/rack-reverse-proxy),但作者提到它可能还没有准备好用于生产。使用Rack中间件代理应该能够将你的子域名yourdomain.com/blog转发到另一个网站your-phpfog-account.com/wordpress-installation。

1
据我所知,如果你使用Heroku,你无法访问Apache配置文件,如果可以的话,你可以使用重写规则。
如果你选择不使用Heroku,你总是可以按照我下面详细说明的做法来处理。但是,如果你不使用Heroku,你同样可以将WordPress提取到/public/ rails文件夹中,并再次使用重写规则来处理博客请求。
在你的Apache配置中,你需要添加以下内容。
RewriteRule ^/blog/?(.*)$ http://somedomain.com/~user/blog/$1 [P,NC,QSA,L]

它将把所有对 /blog/ 的请求重定向到另一台服务器。

来源:http://www.igvita.com/2007/07/04/integrating-wordpress-and-rails/


我认为他不想要重写,因为那会将URL栏中的地址更改为another-domain.com/blog而不是original-domain.com/blog - neezer
啊,我懂了。我不熟悉 mod_rewrite 的工作原理。我只是在谷歌上搜索了一些内容,并假设那应该可以满足他的需求。 - Jamie Maddocks

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接