如何修改.htaccess正则,排除dev.domain1.tld并重新启用基础认证?
解决方案
没问题,咱们调整一下正则表达式就能精准满足这个需求。核心思路是用负向前瞻断言排除掉dev.domain1.tld(以及它的子域名,如果需要的话),不让它被标记为live,这样访问该域名时就会触发基础认证。
情况1:仅排除dev.domain1.tld本身,其子域名(如abc.dev.domain1.tld)仍保持live状态
修改第一个SetEnvIfNoCase规则为:
SetEnvIfNoCase Host ^(?!dev\.domain1\.tld$)(.*\.)?domain1\.tld$ live
这里的(?!dev\.domain1\.tld$)是负向前瞻断言,意思是:只有当当前请求的Host不是正好等于dev.domain1.tld时,才继续匹配后面的域名规则。这样就能精准跳过dev.domain1.tld,其他所有domain1.tld的子域名和主域名依然会被标记为live。
情况2:排除dev.domain1.tld及其所有子域名(如sub.dev.domain1.tld、test.sub.dev.domain1.tld等)
如果需要连dev.domain1.tld的子域名也一起排除,改用下面的正则:
SetEnvIfNoCase Host ^(?!.*dev\.domain1\.tld$)(.*\.)?domain1\.tld$ live
这里的(?!.*dev\.domain1\.tld$)表示:只要请求的Host以dev.domain1.tld结尾(不管前面有多少级子域),就不匹配该规则。这样所有关联dev.domain1.tld的域名都不会被标记为live,都会触发基础认证。
完整配置示例(以情况1为例)
SetEnvIfNoCase Host ^(?!dev\.domain1\.tld$)(.*\.)?domain1\.tld$ live SetEnvIfNoCase Host ^(.*\.)?domain2\.tld$ live <RequireAny> Require valid-user Require env live </RequireAny>
原理说明
<RequireAny>块的逻辑是:只要满足其中一个条件就允许访问。修改后的规则把目标域名排除在live标记之外,所以访问这些域名时,只有Require valid-user(基础认证)条件生效,就会弹出认证窗口。
内容的提问来源于stack exchange,提问作者René M.
相关产品推荐
相关产品推荐

