【问题标题】:Redirect folder to subdomain将文件夹重定向到子域
【发布时间】:2012-02-08 07:26:27
【问题描述】:

我想在一个域上拥有 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

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

【问题讨论】:

    标签: ruby-on-rails .htaccess redirect


    【解决方案1】:

    首先,您必须在 HTML 链接中将 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)。

    所以,使用url重写将链接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_proxy 和 mod_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。

    【讨论】:

    • 我认为你没有理解我的问题。如果我在 blog 文件夹中有一些简单的 html 文件,它会起作用,因为 blog.example.com 和 example.com/blog 都指向同一个文件夹。但是我有 Ruby on Rails 应用程序,它们位于 rails_apps 文件夹中。 public_html 文件夹和 blog 子文件夹都只包含一个文件:.htaccess
    • @TrueSoft 我了解您的问题。这就是为什么我建议您使用代理解决方案。您还必须为blog.example.com 设置virtualhost,这样您的Ruby 文件才能正常工作。
    • 我找不到文件 httpd.conf。反正我觉得有一个更简单的解决方案,比如写一些重定向,但是我对语法不是很熟悉。
    • @TrueSoft 试试你的方法:)。
    • Thinking Monkey,这家伙使用共享服务托管服务提供商。您的整个方法仅在 如果 您对 Apache 配置具有 root 访问权限时才有效。这不是这里的情况。
    【解决方案2】:

    解决方案取决于您的托管服务提供商如何实施多子域映射。有些提供控制面板,以便您可以注册子域并将每个子域指向文件空间中的单独子目录。有些人只会将*.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 可以查看很多变体。

    【讨论】:

    • 感谢您的回答。我进行了更多搜索并设法修复它。我确实为每个子域设置了单独的子目录。用blog/.htaccess 写这个似乎可行:RewriteEngine on RewriteCond %{HTTP_HOST} ^(www\.)?(blog\.)?example\.com$ RewriteRule ^(.*)$ http://example.com:12002/$1 [P,QSA,L]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2014-09-05
    • 2012-11-23
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多