我需要在我的网站上进行基本身份验证,除非 URL 中存在特定的哈希值。
- www.example.com=> 需要身份验证
- www.example.com/whatever=> 需要身份验证
- www.example.com/whatever?hash=123456=>无需身份验证
AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
<RequireAny>
<RequireAll>
Require expr %{QUERY_STRING} = 'hash=123456'
</RequireAll>
Require valid-user
</RequireAny>
hash=123456
基本身份验证有效,但即使在 URL 中也需要身份验证。我做错了什么?
更新
这是我的全部.htaccess
内容。
AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
Require expr "%{QUERY_STRING} == 'hash=123456'"
Require valid-user
我打www.example.com/?hash=123456并且仍然需要我进行身份验证。
答案1
Require expr %{QUERY_STRING} = 'hash=123456'
您需要将整个表达式括在双引号中。并且==
对于字符串比较,它应该是 (双等号),而不是=
。
您也不需要任何RequireAny
和RequireAll
容器,因为RequireAny
这是隐含的默认值。
因此,以下内容应该足够了:
AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
Require expr "%{QUERY_STRING} == 'hash=123456'"
Require valid-user
请注意,以上是精确字符串比较。因此,如果可能存在其他查询字符串参数,则需要使用正则表达式。例如:
Require expr "%{QUERY_STRING} =~ /(^|&)hash=123456($|&)/"
或者,使用表达式,并且仅在以下情况<If>
下应用 HTTP 身份验证:hash=123456
不是出现在查询字符串中。例如:
<If "%{QUERY_STRING} !~ /(^|&)hash=123456($|&)/">
AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
Require valid-user
</If>
答案2
我猜测'
in'hash=123456'
是表达式的一部分,而不是您所期望的引号。
对于精确匹配,请尝试:
Require expr "%{QUERY_STRING} == hash=123456"
如果您有除 之外的其他参数hash
,则可能需要正则表达式:
Require expr "%{QUERY_STRING} =~ /hash=123456/"
但是,这也将匹配someparam=foo&anythinghash=12345678
。对此的可能修复:
Require expr "%{QUERY_STRING} =~ /(^|&)hash=123456($|&)/"
答案3
我最终在我的 PHP 控制器中检查了哈希值,并且只添加了.htaccess
基于的异常Request_URI
,但即使这样做,我仍然会收到身份验证提示。
然后我明白了我的异常是可以的,但特定的 URI 正在请求额外的资源,如 JS、CSS、字体和图像文件,这些资源不是在允许的 URI 上,这就是为什么我仍然需要进行身份验证。
我的目标是,2 个特定的 URI 无需身份验证即可完全访问(form/installation
和form/vehicules
),因此,我所做的如下:
AuthUserFile /path/to/.htpasswd
AuthType Basic
AuthName "Dev"
SetEnvIf Request_URI ^/(form/installation|form/vehicules) noauth=1
<RequireAny>
Require env noauth
Require env REDIRECT_noauth
Require valid-user
</RequireAny>
<FilesMatch "\.(?i:css|js|svg|otf|png|jpe?g|ico)$">
Require all granted
</FilesMatch>
现在,两个 URI 都无需请求身份验证即可加载,并且包含所有需要的资源。