.htaccess将子域重写到目录


Answers:


107

尝试将其放在您的.htaccess文件中:

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

对于更通用的规则(适用于任何子域,而不仅仅是sub),请用以下内容替换最后两行:

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

3
Ansari的解决方案可以使用,但是,当我导航到时http://test.domain.com,URL会将我重定向到http://test.domain.com/subdomains/test/。是否可以不显示/subdomains/test/结尾?
Erik Djupvik

2
在这种情况下,我相信您将不得不考虑使用mod_proxy并指定一个P标志L
安萨里(Ansari)2012年

1
不,http://test.domain.com/subdomains/test/当我只想显示它时,它会重定向到,http://test.domain.com/
Erik Djupvik,2012年

1
我看不到它如何重定向到test.domain.com/subdomains/test-也许这里还有其他事情。您可以RewriteBase /在之后添加RewriteEngine on吗?另外,如果要保持显示状态test.domain.com,则必须使用mod_proxy和[P]标志。
安萨里

1
我可以使用@anubhava的答案在这里工作: stackoverflow.com/a/22395008/128984
Micah

50

我不是mod_rewrite专家,我经常为此感到困扰,但是我已经在我的一个站点上做到了这一点,根据您的情况,它可能还需要其他标志等。我正在使用这个:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteCond %{REQUEST_URI} !^/subdomains/subdomain
RewriteRule ^(.*)$ /subdomains/subdomain/$1 [L] 

此网站其余部分的所有其他重写规则都必须随后执行,以防止它们干扰您的子域重写。


我会这样说。我发现此设置与此处的答案是正确的设置。
切塔巴哈那2015年

5
只是作为参考,以防有人开始用.htaccess谈到这个页面(像我一样),除了创造实际的.htaccess文件,因为它生效,你需要设置AllowOverride你的VirtualHost设置(stackoverflow.com/a/22819550/1657502) ,启用Apache的rewrite模块,然后重新启动Apache(stackoverflow.com/a/5758551/1657502
Antonio Vinicius Menezes Medei 2016年

如果您使用www访问子域,则此方法将无效。@Minh解决方案将在所有情况下均适用。
Rohan Khude

@RohanKhude,您是说要让www.example.com和example.com提供不同的内容吗?因为通常对于SEO,您将拥有www.example.com来发出对example.com的永久重定向,反之亦然。
Lee Kowalkowski

1
@RohanKhude www作为子域的子域也是在DNS级别上必须工作的东西,不是吗?我认为您期望它适用于任意子域是不正确的。Minh的答案(stackoverflow.com/a/41389905/30945)假定您的.htaccess配置仅支持1个子域,并且仅支持1个子域,因此在这方面的稳定性较差。我的解决方案可以根据需要支持任意数量的子域,但是,您需要显式定义每个受支持的子域,但是www.最好通过重定向而不是重写来支持可选前缀。
Lee Kowalkowski

16

您可以在.htaccess中使用以下规则将子域重写为子文件夹:

RewriteEngine On

 # If the host is "sub.domain.com"
 RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
 # Then rewrite any request to /folder
 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

逐行说明:

  RewriteEngine on

上面的行告诉服务器打开引擎以重写URL。

  RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]

此行是RewriteRule的条件,在此条件下,我们使用正则表达式模式与HTTP主机进行匹配。该条件表明,如果主机是sub.domain.com,则执行规则。

 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

该规则与http://sub.domain.com/foo匹配,并在内部将其重定向到http://sub.domain.com/folder/foo

sub.domain.com替换为您的子域和文件夹,并将其替换为您要将子域指向的文件夹的名称。


1
这对我来说是正确的答案-有关如何到达此处的说明如下。当我在主站点TLD上安装SSL时,到达子域重定向的一个古老的问题显然已经中断了。重定向最初仍然尝试仍然使用主站点TLD,并且违反了安全规则。我需要的是将子域(位于完全不同的TLD上)保留在同一主机上,但远离主站点。如上所述添加重写规则使我能够将整个子域转发到主TLD站点下托管的文件夹。
理查德·鲍恩

8

我遇到了同样的问题,并在http://www.webmasterworld.com/apache/3163397.htm中找到了详细的说明

我的解决方案(子域的内容应位于名为的文件夹中sd_subdomain

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} subdomain\.domain\.com
RewriteCond $1 !^sd_
RewriteRule (.*) /sd_subdomain/$1 [L]

1
它对我不起作用,是否必须在域的dns区域中配置某些内容?
totoaussi 2015年

1
@totoaussi,您应该为每个子域创建一个* A记录或一个A记录,指向同一服务器。
Pablo Torrecilla 2015年

4

这将重定向到同一文件夹的子域:

.httaccess

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain\.com/subdomains/%1


2

重定向子域目录:

RewriteCond %{HTTP_HOST} ^([^.]+)\.(archive\.example\.com)$ [NC]
RewriteRule ^ http://%2/%1%{REQUEST_URI} [L,R=301]

0

对于任何子域请求,请使用以下命令:

RewriteEngine on 
RewriteCond %{HTTP_HOST} !^www\.band\.s\.co 
RewriteCond %{HTTP_HOST} ^(.*)\.band\.s\.co 
RewriteCond %{REQUEST_URI} !^/([a-zA-Z0-9-z\-]+) 
RewriteRule ^(.*)$ /%1/$1 [L] 

只需将一些文件夹与所需的子域名相同即可。文件夹必须这样存在:domain.com/sub for sub.domain.com


这对我有用,但不保留文件。例如sub.domain.com/index.php抛出404
Paolo Falomo '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.