您可以使用重写规则将所有子文件夹设为子域吗?
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
指令仍应处理。
所以如果你有这样的结构:
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
指令仍应处理。