【问题标题】:.htaccess SetEnvIfNoCase Host exclude specific subdomain.htaccess SetEnvIfNoCase Host 排除特定子域
【发布时间】:2020-12-09 13:28:06
【问题描述】:

我们为一个虚拟主机获得了一堆域。 包括任何子域在内的所有域都需要基本身份验证,除非我们将它们定义为“实时”。将域定义为“实时”时,所有子域也是live

SetEnvIfNoCase Host ^(.*\.)?domain1\.tld$ live
SetEnvIfNoCase Host ^(.*\.)?domain2\.tld$ live

<RequireAny>
    Require valid-user
    Require env live
</RequireAny>

现在我想排除 dev.domain1.tld ,以便再次需要基本身份验证。

我需要如何更改 RegEx 以排除 dev.domain1.tld

【问题讨论】:

  • SetEnvIfNoCase Host ^((?!dev\.).*\.)?domain1\.tld$ 应该可以解决问题
  • 是的,效果很好!如果我想排除另一个子域怎么办?那会是^((?!dev\.|!test\.).*\.)?domain1\.tld$ 吗?另外,请发表您的评论作为答案,以便我接受。非常感谢,你拯救了我的一天!

标签: regex apache .htaccess environment-variables


【解决方案1】:

您可以按照 cmets 中的@AmitVerma 建议进行操作,并使用负前瞻。或者,您可以在请求该主机名时简单地取消设置 live env var。

例如:

SetEnvIfNoCase Host ^([^.]+\.)?domain1\.tld$ live
SetEnvIfNoCase Host ^www\.domain1\.tld$ !live

第二个指令中环境变量上的!前缀取消设置先前设置的live环境变量。

请注意(.*\.) 将匹配任意数量的子子域,以防出现问题。

那会是^((?!dev\.|!test\.).*\.)?domain1\.tld$吗?

您应该删除第二个!,并且可以从alternation 中删除文字\.(文字点)。定义负前瞻(即不应出现的子模式)的是左括号后的?!。例如:

^((?!dev|test).*\.)?domain1\.tld$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多