我尝试托管两个 * 独立 * 的站点,使用主域[www.]example.com
和一个子域sub.example.com
,在一个 * 共享 * 的托管环境中,由LiteSpeed提供支持。子域的文档根是public_html/sub/
,但是它的内容 * 不 * 应该通过example.com/sub/...
访问。
最初,我在public_html/sub/.htaccess
中用RewriteCond %{HTTP_HOST} !^sub\.example\.com$ [NC]
编写了一个规则,以禁止错误的请求,这似乎是有效的。
但是很明显,当有更多的子域时,我将不得不对每个子域重复这条规则。此外,主域的目录与子域混在一起。因此,我将主域的文件移到public_html/www/
目录下,在下面的.htaccess
文件中添加以下行,并删除之前编写的规则。
在public_html/.htaccess
中:
RewriteEngine On
RewriteOptions InheritDownBefore
RewriteRule ^ /www%{REQUEST_URI} [END]
在public_html/www/.htaccess
中:
RewriteEngine On
RewriteOptions IgnoreInherit
...
根据文档,我假设该规则会将主域的文档根“更改”为public_html/www/
,因为它首先被评估,并停止在任何目录中的重写(只要子目录不关闭重写引擎或忽略继承),而子域不会从其文档根(public_html/.htaccess
)之外的目录继承规则,因此不受影响。
但是,修改后的example.com/sub/...
实际上仍然可以访问,就像InheritDown*
不被LiteSpeed支持一样。更奇怪的是,sub.example.com
中的有效URL会得到未找到的错误,表明它们可能会被重写,因为继承的规则。我不确定这是LiteSpeed的bug,我应该报告一个问题吗?或者,我误解了这个选项?
顺便问一下,是否有其他解决方案来实现相同的功能?
1条答案
按热度按时间1cklez4t1#
在尝试了更多的规则并将它们与标准的Apache服务器进行了比较之后,我基本上确定了继承特性在LiteSpeed中是 * 非常 * 有缺陷的,而且我也找到了一个解决方案来满足我的需要。我只会回答我的问题,但我认为仍然有更好的解决方案(并期待新的答案)。
首先,我发现重写选项
InheritBefore
的行为就像LiteSpeed中的Inherit
一样(继承的规则仍然放在最后)。而且IgnoreInherit
并没有阻止继承,实际上也像LiteSpeed中的Inherit
一样。InheritDown*
有时随机工作,但大多数时候它不工作。考虑到这些奇怪的问题,也许最好避免在LiteSpeed服务器上使用继承。
子域不会从其文档根目录之外的目录继承规则,因此不受影响。
此外,我必须澄清
Inherit*
实际上对两个服务器上的子域都有意义。因此,应该在public_html/.htaccess
中添加重写条件,以避免影响子域:(* 对于标准Apache服务器,这足以分隔主域。*)
由于
InheritDown*
在包含.htaccess
的子目录中可能不起作用,因此仍需要在每个子目录的.htaccess
中添加一行:但是,由于这种变通方法也不太好,在找到更好的方法之前,最好保持以前的做法。