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

时间:2013-05-26 10:12:45

标签: apache .htaccess mod-rewrite redirect subdomain

我在这里已经阅读了很多关于此的问题和答案,但似乎没有解决我的具体问题。

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

所以:x.domain.com会转到domain.com/x,而y.domain.com会转到domain.com/y - 但我希望这样做,而地址栏中的URL不会更改。< / p>

这是我到目前为止所拥有的:

    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,我收到重定向循环错误。

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

3 个答案:

答案 0 :(得分:8)

首先,确保正确配置了apache配置中的vhost,并且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(并加载子模块)并交换&#34; L&#34;标志着&#34; P&#34;标志:

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

如果这不起作用,在子域调用上查看vhost配置和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

答案 1 :(得分:7)

如果您的服务器配置为允许通配符子域,则可以在SELECT MAX(AId), BId FROM TableABBridge GROUP BY BId HAVING Count(AId) = 1 SELECT a.Id FROM TableABBridge a JOIN (SELECT BId FROM TableABBridge GROUP BY BId HAVING Count(AId) > 1) b ON b.BId = a.BId 的情况下实现。 (我通过创建一个名为.htaccess的子域名在JustHost中实现了这一点。将其添加到您的mod_proxy文件中:

*

答案 2 :(得分: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旁边,您还可以将子目录放在root之外,并使用 here 所述的别名访问它。然后在该位置添加相同的.htaccess代码。