我尝试使用 .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 中的其他代码是否在同一运行时不被处理?或者只是在某种预编译步骤中在该运行时的早期阶段被处理?