2013-05-26 31 views
3

我在这里阅读了很多关于此问题的问题和解答,但似乎没有解决我的具体问题。将通配符子域名重定向到子目录,而不更改地址栏中的URL

我想将任何子域重定向到子目录进行匹配。

因此:x.domain.com将转到domain.com/x,并且y.domain.com转到domain.com/y - 但是我想在地址栏中不更改网址的情况下执行此操作。

这是我到目前为止有:

Options +FollowSymLinks 

    RewriteEngine on 

    RewriteBase/

    RewriteCond %{HTTP_HOST} !^(www)\. [NC] 

    RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com [NC] 

    RewriteRule^/%1 [P,L] 

但这需要我到一个网站重定向循环,与在子域仍然存在地址栏的地址不正确。

例如,x.domain.com带我到x.domain.com/x,我得到一个重定向循环错误。

如果有人能指出我正确的方向,我将不胜感激!我没有什么改变,似乎工作...

+0

请参阅我的解决方案。 –

回答

7

首先,确保在Apache配置虚拟主机配置正确,以及domain.com的所有子域都在同一个主机配置(通配符):

<VirtualHost *:80> 
ServerName domain.com 
ServerAlias *.domain.com 
... 

你可以重定向用下面的htaccess的配置工作:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com 
RewriteRule ^(.*)$ http://domain.com/%1/$1 [L,NC,QSA] 

现在,如果你打开asd.domain.com它应该重定向你domain.com/asd。 您仍然有问题,即重定向在URL地址栏中可见。为了防止这种情况,启用mod_proxy的(并加载子模块)的服务器上,并用“P”标志交换“L”标志:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com 
RewriteRule ^(.*)$ http://domain.com/%1/$1 [P,NC,QSA] 

如果这不起作用,查看虚拟主机的配置和子域调用中的error.log内容将会很有帮助!

参考文献:
.htaccess rewrite subdomain to directory
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p

+0

我试过这个,但是我收到一些错误... [Sun May 26 13:02:28 2013] [error] [client 2.126.187.186]尝试服务目录:proxy:http://domain.com/x/ [Sun May 26 13:02:29 2013] [error] [client 2.126.187.186]文件不存在:proxy:http://domain.com/x/favicon.ico – Newnab

+0

当我访问URL x.domain.com我得到一个404,它说:请求的URL /在这台服务器上找不到。 – Newnab

+0

之前它是否有效,当你有标志“L”而不是“P”?当mod_proxy未启用时,我通常会收到消息“尝试提供目录:proxy:domain.com/x”!而且可以肯定的是,您将“domain.com”替换为您的真实域名? – meberhard

0

我命名的子目录下$_SERVER['DOCUMENT_ROOT']匹配我的子域,像这样:

/ 
var/ 
    www/ 
     html/ 
       .htaccess 
       subdomain1.domain.com/ 
       subdomain2.domain.com/ 
       subdomain3.domain.com/ 

/var/www/html立场作为'DOCUMENT_ROOT'。然后把下面的代码.htaccess文件:

RewriteEngine on 
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST}/ 
RewriteRule (.*) /%{HTTP_HOST}/$1 [L] 

它可以作为重定向通配符子域子目录,没有地址栏更改URL。

旁边的vhost,你也可以把使用别名它外面根和访问子目录描述here。然后在该位置放置相同的.htaccess代码。

7

这可以在.htaccess没有mod_proxy实现,只要您的服务器配置为允许通配子子域。 (我通过手动创建一个名为*的子域在JustHost中实现了这一点)。将此添加到您的.htaccess文件中:

RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\.website\.com$ 
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$ 
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1 
RewriteRule ^(.*)$ /%1/$1 [QSA] 
相关问题