将文件夹重定向到子域

时间:2012-02-08 07:26:27

标签: ruby-on-rails .htaccess redirect

我想在一个域上拥有2个Ruby on Rails应用程序。

第一个是example.com;我用.htaccess(将RewriteRule改为example.com:12001

完成了

我希望另一个属于子域,例如blog.example.com。所以我创建了一个子域,并在文件.htaccess中重定向到example.com:12002

一切正常,但如果我去地址example.com/blog,我没有被重定向,我在浏览器中看到了public_html中博客文件夹的内容:

Index of /blog

    Parent Directory

当网址为blog.example.com时,我想转到第二个应用(example.com/blog)。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

首先,您必须在HTML href中将http://blog.example.com/whatever_or_empty替换为http://www.example.com/blog/whatever_or_empty

blog.example.com虽然是子域名,但却是一个不同的URL。即,当RewriteRule重写到另一个URL时,将发生外部重定向。这将反映在浏览器中。是暂时的redirect(302(the default))permanent redirect(301)

因此,使用网址重写将链接http://blog.example.com/更改为http://www.example.com/blog/是没用的。


虽然,您可以使用Apache Module mod_proxy实现此目的。

Apache代理模块具有以下功能:

  
      
  • mod_proxy:核心模块处理代理基础架构和配置以及管理代理请求。
  •   
  • mod_proxy_http:它处理使用HTTP和HTTPS获取文档。
  •   
  • mod_proxy_ftp:用于处理使用FTP获取文档。
  •   
  • mod_proxy_connect:它处理用于安全(SSL)隧道的CONNECT方法。
  •   
  • mod_proxy_ajp:它处理Tomcat和类似后端服务器的AJP协议。
  •   
  • mod_proxy_balancer在多个后端上实现群集和负载平衡。
  •   
  • mod_cache,mod_disk_cache,mod_mem_cache:这些涉及管理文档缓存。要启用缓存,需要mod_cache以及disk_cache和mem_cache中的一个或两个。
  •   
  • mod_proxy_html:这会将HTML链接重写为代理的地址空间。
  •   
  • mod_xml2enc:它代表mod_proxy_html和其他标记过滤模块支持国际化(i18n)。空间。
  •   
  • mod_headers:这会修改HTTP请求和响应标头。
  •   
  • mod_deflate:与客户端和后端协商压缩。
  •   

您需要启用至少mod_proxymod_proxy_http个模块才能使代理工作:

你的apache的conf文件中应该有类似的行:

LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_module modules/mod_proxy.so

Virtualhost http://www.example.com 中使用此功能

ProxyPass /blog http://blog.example.com
ProxyPassReverse /blog http://blog.example.com
ProxyRequests On
ProxyVia On

<Proxy *>
Order allow,deny
Allow from all
</Proxy>

<强>解释

  

您还可以使用mod_cache mod_cache的缓存 有关缓存的更多信息,请参阅此处:mod_cache Apache Docs


还可以通过设置此选项来禁用索引视图索引:

options -indexes

index添加到文件夹blog

答案 1 :(得分:0)

解决方案取决于托管服务提供商如何实现多子域映射。有些提供了一个控制面板,以便您可以注册子域并将每个子域指向文件空间中的单独子目录。有些人会将*.yourdomain.zzz映射到yourdomain.zzz的文档根目录,根据您的描述,这就是您正在发生的事情。在这种情况下,您需要解码 HTTP_HOST 变量并对其进行路由。但是你还需要停止重写规则循环,以便sub1.yourdomain.zzz不会映射到yourDocRoot / sub1 / sub1 / sub1 ...`

如果您要处理 sub1 sub2 子域名,那么您可以使用以下顶级规则执行此操作:

RewriteBase  /
RewriteCond  %{ENV:REDIRECT_INSUB} !=1
RewriteCond  %{HTTP_HOST}          (sub1|sub2)\.yourdomain\.zzz
ReweriteRule ^(.*)                 %1/$1         [L,E=INSUB:1]

搜索 [。htaccess] HTTP_HOST 以查看其中的大量变体。