4

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

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

所以: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]

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

例如,x.domain.com 将我带到 x.domain.com/x,我收到重定向循环错误。

如果有人能指出我正确的方向,我将不胜感激!我所做的任何更改似乎都不起作用...

4

3 回答 3

9

首先,确保 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(并加载子模块)并将“L”标志与“P”标志交换:

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

于 2013-05-26T11:11:21.730 回答
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]
于 2016-04-06T18:30:16.333 回答
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之外,您还可以将子目录放在根目录之外,并使用此处描述的别名访问它。然后将相同的代码放在该位置。.htaccess

于 2016-01-07T03:49:02.347 回答