使用 .htaccess 以根目录动态加载子域文件夹

Dynamically load subdomains folder as root with .htaccess

我正在尝试使用 .htaccess 来实现,这样我就可以使用一个虚拟主机设置的配置访问我的所有项目,并在主机文件中定义一个 URL。这将允许我将一个项目拖放到文件夹中,它无需我进行任何其他配置即可运行,并在工作时节省大量时间。

示例 A:prestige.projects.dev 托管在 D:/projects/prestige

示例 B:newproject.projects.dev 托管在 D:/projects/newproject

下面的代码适用于示例 A 的特定情况,但我不知道如何让它适用于所有项目 'dynamically'。我的目标是使 prestige 成为通配符。例如:newproject.projects.dev 应该 自动 加载D:/projects/newproject 的内容。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^prestige\.projects\.dev$
RewriteCond %{REQUEST_URI} !^/prestige/
RewriteRule (.*) /prestige/

只要达到目标,我愿意接受除此方法之外的其他建议。

试试下面的方法:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^([a-z]+)\.projects\.dev [NC]
RewriteCond "%{REQUEST_URI} /%1" !^(/[^/]+)[^\s]*\s$
RewriteRule (.*) /%1/ [L]

%1 是对最后匹配的 CondPattern.

中捕获组的反向引用

第二个 RewriteCond 指令是硬编码检查的 "wildcard" 版本,以确保 REQUEST_URI 没有以与子域匹配的目录开始 - 从而防止重写循环。

字符串 %{REQUEST_URI} /%1(在第一次重写后扩展为“/<directory>/<anything> /<subdomain>”形式的字符串)与正则表达式 ^(/[^/]+)[^\s]*\s$ 匹配,后者检查是否 /<directory>/<subdomain 相同(</code> 是对正则表达式中捕获组的内部反向引用)。只有当这不匹配时,才会发生 <code>RewriteRule 替换 - 与您当前规则的工作方式相同。