Htaccess 将子文件夹重写为子域

Htaccess rewrite subfolder to subdomain

我有一个包含许多子域的域;我想做的是将特定的子域映射到特定的子文件夹。

假设域是 example.com,我有这些域:

我的 var/www/html 文件夹中有 2 个子文件夹:

所以我想要的是设置正确的映射以便:

显然demo1.example.com应该使用/var/www/html/demo1中的内容而demo2.example.com应该使用/var/www/html/demo2

中的内容

您可能想要实施处理两个方向的规则: 1. 将对 "www" 主机的请求重定向到 "subdomain"(实际上是另一个主机名) 2. 将对非 www 主机的请求重写到一个文件夹,如果该文件夹存在的话

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule ^/?demo1/(.*)$ https://demo1.example.com/ [R=301]
RewriteRule ^/?demo2/(.*)$ https://demo2.example.com/ [R=301]

RewriteCond %{HTTP_HOST} ^demo1\.example\.com$
RewriteRule ^ /demo1/%{REQUEST_URI} [END,QSA]
RewriteCond %{HTTP_HOST} ^demo2\.example\.com$
RewriteRule ^ /demo2/%{REQUEST_URI} [END,QSA]

你当然可以为第二部分(内部重写)实现一个更通用的规则,但是上面的显式方法更容易达到,因此更容易维护。出于这个原因,我更喜欢它。

最好从 302 临时重定向开始,然后在确定一切设置正确后才将其更改为 301 永久重定向。这可以防止在尝试时出现缓存问题...

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在您的 http 服务器错误日志文件中看到对不受支持的 [END] 标志的明确提示。您可以尝试升级或使用旧的 [L] 标志,在这种情况下它可能会工作相同,尽管这在一定程度上取决于您的设置。

这些规则同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般性评论:您应该始终更喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件 (".htaccess")。那些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试并且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则(这是一个明显的安全噩梦)的应用程序的情况下作为最后的选择提供。