.htaccess 将子域重写到目录

Posted

技术标签:

【中文标题】.htaccess 将子域重写到目录【英文标题】:.htaccess rewrite subdomain to directory 【发布时间】:2012-05-25 10:13:00 【问题描述】:

是否可以使用 ?

例子:

http://sub.domain.com/

显示内容

http://domain.com/subdomains/sub/

【问题讨论】:

【参考方案1】:

尝试将其放入您的 .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]

【讨论】:

Ansari 的解决方案会起作用,但是,当我导航到 http://test.domain.com 时,URL 会将我重定向到 http://test.domain.com/subdomains/test/。最后不显示/subdomains/test/可以吗? 在这种情况下,我相信您将不得不考虑使用mod_proxy 并在L 之外指定P 标志。 不,它重定向到http://test.domain.com/subdomains/test/,而我只希望它显示http://test.domain.com/ 我看不到它如何重定向到test.domain.com/subdomains/test - 也许这里还有其他事情发生。你能在RewriteEngine on 后面加上RewriteBase / 吗?此外,如果你想让它保持显示 test.domain.com,你将不得不使用 mod_proxy 和 [P] 标志。 我可以在这里使用@anubhava 的答案让它工作:***.com/a/22395008/128984【参考方案2】:

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

RewriteEngine on

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

网站其余部分的任何其他重写规则必须在之后执行,以防止它们干扰您的子域重写。

【讨论】:

我会这么说。我发现这个设置和我的答案here一样是正确的。 作为参考,如果有人以.htaccess开头的人来到这个页面(就像我做的那样),除了创建实际的.htaccess文件,为了它生效,你需要设置AllowOverride 在您的VirtualHost 设置(***.com/a/22819550/1657502)中,启用 Apache 的 rewrite 模块,然后重新启动 Apache(***.com/a/5758551/1657502) 如果您使用 www 访问子域,这将不起作用。 @Minh 解决方案适用于所有情况。 @RohanKhude,你的意思是如果你想让 www.example.com 和 example.com 提供不同的内容?因为通常,对于 SEO,您需要 www.example.com 发出永久重定向到 example.com,反之亦然。 @RohanKhude www 作为子域的子域,您还必须在 DNS 级别上工作,不是吗?我认为您认为它应该适用于任何任意子域的期望是不正确的。 Minh 的回答 (***.com/a/41389905/30945) 假设您的 .htaccess 配置支持 1 个且仅支持 1 个子域,因此在这方面不太健壮。我的解决方案支持尽可能多的子域,但是是的,您需要明确定义每个支持的子域,但是通过重定向而不是重写可能最好支持可选的 www. 前缀。【参考方案3】:

您可以在.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 替换为您的子域,并将文件夹替换为您要将子域指向的文件夹的名称。

【讨论】:

这对我来说是正确的答案 - 我如何到达这里的解释如下。来到这里寻找一个古老的子域重定向问题,当我在主站点 TLD 上安装 SSL 时,该问题显然中断了。重定向最初仍在尝试使用主站点 TLD 并违反安全规则。我需要的是将子域(位于完全不同的 TLD 上)保留在同一主机上但远离主站点。如上所述添加重写规则使我能够将完整的子域转发到主 TLD 站点下托管的文件夹。【参考方案4】:

我也遇到了同样的问题,在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]

【讨论】:

它对我不起作用,我必须在域的 dns 区域中配置一些东西吗? @totoaussi 您应该为每个子域创建一条 * A 记录或一条 A 记录,指向同一个服务器。【参考方案5】:

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

.httaccess

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

【讨论】:

【参考方案6】:

尝试把这个 .htaccess 文件放在子域文件夹中:

RewriteEngine On

RewriteRule ^(.*)?$ ./subdomains/sub/$1

当您只希望它显示 http://sub.example.org/ 时,它会重定向到 http://example.org/subdomains/sub/

【讨论】:

这个问题是2012年提出的,有8个答案。您的回答在这一点上是否增加了价值? 即使您使用www访问子域,此解决方案也可以使用【参考方案7】:

重定向子域目录:

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

【讨论】:

【参考方案8】:

对于任何子域请求,使用这个:

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【参考方案9】:

编辑文件.htaccess

RewriteEngine On 
RewriteCond %HTTPS off 
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]

【讨论】:

虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。在解释代码时,您也可能会得到用户的积极反馈/赞成。 解释一下。

以上是关于.htaccess 将子域重写到目录的主要内容,如果未能解决你的问题,请参考以下文章

子域 mod_rewrite (htaccess) 到相对目录

.htaccess 重写语言子域

子域“m”。与 WordPress 和。 htaccess(在 htaccess 中的重写规则冲突。)

htaccess 子域重写规则

.htaccess 将子域重定向到外部 URL

使用 .htaccess 重写动态子域