.htaccess 重写选项InheritDown* 在LiteSpeed服务器上的子目录和子域中表现得很奇怪

bvjveswy  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(132)

我尝试托管两个 * 独立 * 的站点,使用主域[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,我应该报告一个问题吗?或者,我误解了这个选项?
顺便问一下,是否有其他解决方案来实现相同的功能?

1cklez4t

1cklez4t1#

在尝试了更多的规则并将它们与标准的Apache服务器进行了比较之后,我基本上确定了继承特性在LiteSpeed中是 * 非常 * 有缺陷的,而且我也找到了一个解决方案来满足我的需要。我只会回答我的问题,但我认为仍然有更好的解决方案(并期待新的答案)。
首先,我发现重写选项InheritBefore的行为就像LiteSpeed中的Inherit一样(继承的规则仍然放在最后)。而且IgnoreInherit并没有阻止继承,实际上也像LiteSpeed中的Inherit一样。InheritDown*有时随机工作,但大多数时候它不工作。
考虑到这些奇怪的问题,也许最好避免在LiteSpeed服务器上使用继承
子域不会从其文档根目录之外的目录继承规则,因此不受影响。
此外,我必须澄清Inherit*实际上对两个服务器上的子域都有意义。因此,应该在public_html/.htaccess中添加重写条件,以避免影响子域:
(* 对于标准Apache服务器,这足以分隔主域。*)

RewriteEngine On
RewriteOptions InheritDownBefore

# added
RewriteCond %{IS_SUBREQ} false
RewriteCond %{HTTP_HOST} ^(?:www\.)?example\.com$ [NC]
RewriteRule ^ /www%{REQUEST_URI} [L]

由于InheritDown*在包含.htaccess的子目录中可能不起作用,因此仍需要在每个子目录的.htaccess中添加一行:

RewriteOptions InheritBefore

但是,由于这种变通方法也不太好,在找到更好的方法之前,最好保持以前的做法。

相关问题