apache 条件语句 - 处理顺序是什么?

apache 条件语句 - 处理顺序是什么?

我尝试使用 .htaccess 文件配置通过 http auth 保护对子目录的访问。

对我来说,这是 apache 2.4 的完整工作代码。

# Conditionally set environment variable BACKEND_PROTECTION (version for apache 2.4)

<If "%{HTTP_HOST} == 'www.somedomain.de'">
    SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>
<If "%{HTTP_HOST} == 'www.someotherdomain.de'">
    SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>

<RequireAny>
  <RequireAll>
    Require not env BACKEND_PROTECTION
    Require all granted
  </RequireAll>
  <RequireAll>
    AuthType Basic
    AuthName "Protected URI"
    AuthUserFile /var/www/config/.htpasswd
    Require valid-user
  </RequireAll>
</RequireAny>

现在我需要另外从身份验证中排除该目录的子目录,所以这就是我尝试的。

<If "%{HTTP_HOST} == 'www.somedomain.de'">
    SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>
<If "%{HTTP_HOST} == 'www.someotherdomain.de'">
    SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
</If>

# disable protection for backend files loaded in frontend
SetEnvIf REQUEST_URI "^/typo3/sysext/" !BACKEND_PROTECTION

但这不起作用,在此代码之后,<RequireAny>上面的以下块会触发 http 身份验证,就好像仍然设置了 BACKEND_PROTECTION 一样。但如果我将否定放在里面,<If></If>它就会按预期工作。

<If "%{HTTP_HOST} == 'www.somedomain.de'">
    SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
    SetEnvIf REQUEST_URI "^/typo3/sysext/" !BACKEND_PROTECTION
</If>
<If "%{HTTP_HOST} == 'www.someotherdomain.de'">
    SetEnvIf REQUEST_URI "^/typo3/" BACKEND_PROTECTION
    SetEnvIf REQUEST_URI "^/typo3/sysext/" !BACKEND_PROTECTION
</If>

为什么会这样?下面摘自 If-Documentation 的陈述到底是什么意思?

描述:包含仅在运行时请求满足条件时才适用的指令

.htacces 中的其他代码是否在同一运行时不被处理?或者只是在某种预编译步骤中在该运行时的早期阶段被处理?

相关内容