将通配符子域redirect到子目录,而不更改地址栏中的URL

我在这里读了很多关于这个的问题和答案,但没有一个能够解决我的具体问题。

我想将任何子域redirect到子目录进行匹配。

所以:x.domain.com会去domain.com/x,而y.domain.com会去domain.com/y – 但我想这样做,而没有在地址栏中的url更改。

以下是我到目前为止:

Options +FollowSymLinks RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} !^(www)\. [NC] RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com [NC] RewriteRule ^ /%1 [P,L] 

但是,这使我到一个网站redirect循环,在一个不正确的地址在子网域仍然存在的URL栏中。

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

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

首先,确保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] 

如果这不起作用,查看vhost配置和在子域调用上的error.log的内容将是有帮助的!

参考文献:
.htaccess重写子目录到目录
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p

如果你的服务器被配置为允许通配符子域,那么这个可以在.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] 

我将$_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。

除了虚拟主机之外 ,您还可以将子目录放在根目录之外,并按照此处所述使用别名访问它。 然后把相同的.htaccess代码放在那个位置。