我想添加一条规则,以便所有子域都重定向到子文件夹。例如:
app1.example.com -> example.com/app1
app2.example.com -> example.com/app2
something.example.com -> example.com/something
所有子域名都仅有一级深度。
问题
- 哪些 DNS 提供商允许我这样做?
- 这些替代方案可行吗?
- 将它们全部重定向到具有静态 IP 的特殊 Web 应用程序,该应用程序会重定向到正确的子文件夹。我如何知道它们来自哪个子域?
- 当我需要时,以编程方式创建每条规则。哪些 DNS 提供商具有添加规则的 API 访问权限?我认为 Amazon Route 53 可能是答案。
答案1
哪些 DNS 提供商允许我这样做?
所有有能力的人。它甚至不需要是特定于 DNS 的提供,大多数好的主机也会帮助您。有两个阶段:
- 添加 DNS 条目
*.example.com
- 主机的 Web 服务器(例如 Apache)设置为
*.example.com
通过将其路由到 来example.com
响应VirtualHost
。
然后,在您的终端,添加一个.htaccess
使用RewriteRule
来捕获每个子域的条目,并使用变量将其重定向到文件夹HTTP_HOST
。
未经测试,但类似以下情况:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.example\.com(.*) http://example.com/$1/$2
假设用户请求app1.example.com/bob
。
2号线
这将会捕获app1.example.com
-HTTP_HOST
它将匹配RewriteCond
。
3号线
通常情况下,Apache 只会通过/bob
检查RewriteRule
。要使用子域名,我们需要利用链式强制匹配下一条规则
${HTTP_HOST}$1
| ^ /bob
^ app1.example.com
4号线
决赛RewriteRule
现在对阵app1.example.com/bob
和不是只是/bob
。因此,它可以有一个“完整”的正则表达式来匹配这个子域和路径,并执行所需的重定向。
如果您不想要这个功能,您可以简化规则。
这些替代方案可行吗?将它们全部重定向到具有静态 IP 的特殊 Web 应用程序,该 IP 会重定向到正确的子文件夹。我如何知道它们来自哪个子域?
没有万无一失的方法可以做到这一点。可以尝试 HTTP Referer,但不是总是由所有浏览器发送,一些防火墙会删除标头等。
当我需要时,以编程方式创建每条规则。哪些 DNS 提供商具有添加规则的 API 访问权限?我认为 Amazon Route 53 可能是答案。
这实际上会导致更复杂无法解决上述问题,因此我不推荐这样做。这还会造成延迟:DNS 缓存需要更新,某些访问者在更新之前无法立即使用子域。至少按照我上面的建议,他们可以立即开始使用。