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

是否可以使用 .htaccess 将子域重写到目录?

例子:

显示内容

【问题讨论】:

    标签: apache .htaccess url-rewriting dns subdomain


    【解决方案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 的答案让它工作:stackoverflow.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 设置(stackoverflow.com/a/22819550/1657502)中,启用 Apache 的 rewrite 模块,然后重新启动 Apache(stackoverflow.com/a/5758551/1657502
    • 如果您使用 www 访问子域,这将不起作用。 @Minh 解决方案适用于所有情况。
    • @RohanKhude,你的意思是如果你想让 www.example.com 和 example.com 提供不同的内容?因为通常,对于 SEO,您需要 www.example.com 发出永久重定向到 example.com,反之亦然。
    • @RohanKhude www 作为子域的子域,您还必须在 DNS 级别上工作,不是吗?我认为您认为它应该适用于任何任意子域的期望是不正确的。 Minh 的回答 (stackoverflow.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]
        

        【讨论】:

        • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。在解释代码时,您也可能会得到用户的积极反馈/赞成。
        • 解释一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        相关资源
        最近更新 更多