您可以使用重写规则将所有子文件夹设为子域吗?

Can you make all subfolders subdomains using rewrite rules?

所以如果你有这样的结构:

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

并且您希望每个 'subdomain' 文件夹在 http://subdomain1.example.com instead of 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/ [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
RewriteCond %{HTTP_HOST} ^([^.]+).example.com$ [NC]
RewriteCond %{REQUEST_URI} !%1
RewriteRule ^(.*)$ /%1/ [L]

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

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

例如,请尝试以下操作:

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

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


旁白:

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

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