apache - 您可以使用重写规则使所有子文件夹成为子域吗?
问题描述
因此,如果您有这样的结构:
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
解决方案
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
推荐阅读
- laravel - 将动态值传递给 Laravel 最大验证规则
- sql - BigQuery Firebase 游戏中每个级别的平均硬币
- reactjs - Antd Table React中分别处理分页排序和过滤
- android - 单击 Samsung Galaxy Tab 9.0 版 WebView 中的 SELECT 标记会使应用程序崩溃
- ios - 如何存储传感器数据以避免海量数据泛滥?
- detox - detox react native:支持在测试规范 js 文件中导入 es6
- yocto - 在 Ubuntu 18.04 上制作 yocto 的 image-fsl-qt5
- python - 根据行中的平均元素数删除列
- r - 用于按天迭代列中时间戳的出现的函数
- asynchronous - 取消未来/流/任务,未来收集处理