我想在一个域上拥有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
)。我怎么能这样做?
答案 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_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
。
答案 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 以查看其中的大量变体。