首页 > 解决方案 > 您可以使用重写规则使所有子文件夹成为子域吗?

问题描述

因此,如果您有这样的结构:

public_html/folder/example.com/index.php
public_html/folder/example.com/subdomain1/index.php
public_html/folder/example.com/subdomain2/index.php
public_html/folder/example.com/subdomain3/index.php

并且您希望每个“子域”文件夹在http://subdomain1.example.com上可见,而不是在http://example.com/subdomain1/ ...

您可以通过结合使用通配符子域 DNS 设置和仅 .htaccess 文件来实现此目的吗?

例如,我通过cPanel添加了通配符子域,并且在我的 .htaccess 文件(example.com 文件夹的根目录)中有:

<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^([^.]+).example.com$ [NC]
RewriteCond %{REQUEST_URI} !%1
RewriteRule ^(.*)$ /%1/$1 [L]
</IfModule>

但是每次我尝试访问子域 URL 中的一个子文件夹时,都会收到 500 错误。

有什么我想念的吗?我使用了一个 .htaccess 测试工具来确保规则是正确的。我知道 mod_rewrite 已启用,并且 Apache 设置正确。例如,这部分的 index.php 有问题吗?

我仍然可以访问http://example.com/subdomain1/并查看该站点。它不会像我想象的那样重定向到子域。

任何正确方向的帮助将不胜感激。在这一点上,我已经搜索和测试了几个小时的不同规则。我确实联系了我的主人并确认我拥有所有适当的权限和设置。

如果我错过了 - 这里的想法是,无论何时添加子文件夹(除非出现特定例外),它都应该可以作为子域地址自动访问 - 在 cPanel / DNS 中无需手动添加子域。

///编辑///

下面是 public_html/ 根目录中的 .htaccess 文件。public_html/folder/ 目录中没有 .htaccess。

# ----------------------------------------------------------------------
# CORS-enabled images (@crossorigin)
# ----------------------------------------------------------------------
# Send CORS headers if browsers request them; enabled by default for images.
# developer.mozilla.org/en/CORS_Enabled_Image
# blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
# hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
# wiki.mozilla.org/Security/Reviews/crossoriginAttribute
<IfModule mod_setenvif.c>
  <IfModule mod_headers.c>
    # mod_headers, y u no match by Content-Type?!
    <FilesMatch "\.(gif|png|jpe?g|svg|svgz|ico|webp)$">
      SetEnvIf Origin ":" IS_CORS
      Header set Access-Control-Allow-Origin "*" env=IS_CORS
    </FilesMatch>
  </IfModule>
</IfModule>
# ----------------------------------------------------------------------
# Webfont access
# ----------------------------------------------------------------------
# Allow access from all domains for webfonts.
# Alternatively you could only whitelist your
# subdomains like "subdomain.example.com".
<IfModule mod_headers.c>
  <FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

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

AddType audio/ogg ogg ogv
AddType video/ogg ogg ogv

标签: apache.htaccessmod-rewritednswildcard-subdomain

解决方案


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

这似乎会导致重写循环(500 HTTP 响应)。我认为这是因为REQUEST_URI服务器变量没有更新。

您只希望此代码块在初始请求上执行,因此您可以通过检查REDIRECT_STATUS环境变量来解决此问题,该环境变量在初始请求中未设置(即空)并设置为“200”(如 200 OK 状态) 第一次成功重写后。

例如,请尝试以下操作:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteRule (.*) /%1/$1 [L]

不需要<IfModule>包装器,因为如果没有 mod_rewrite,您的网站将无法运行。与默认情况下正则表达式是贪婪(.*)的相同。^(.*)$


在旁边:

请注意,此插件域.htaccess文件中的 mod_rewrite 指令将覆盖父域.htaccess(即public_html/.htaccess)中的 mod_rewrite 指令,因此没有 HTTP 到 HTTPS - 除非您在服务器配置中明确启用 mod_rewrite 继承。

但是,仍应处理Header父级中的指令。.htaccess


推荐阅读