.htaccess "Allow from env" 禁用 SSLRequire



使用Apache,我在文件夹上强制HTTPS:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "www.example.com"
ErrorDocument 403 https://www.example.com/admin/

我使用 Apache AuthBasic 保护文件夹:

AuthType Basic
AuthName "Administration"
AuthUserFile /path/to/my/.htpasswd
Require valid-user
Satisfy all

像这样,密码始终通过HTTPS发送。它运行良好,但后来我尝试禁用单个 URL 的身份验证:

SetEnvIf Request_URI "crm/index.php$" removeme_uri
Order deny,allow
Deny from all
Allow from env=removeme_uri
Satisfy any

此 URL 不要求身份验证,其他 URL 会要求身份验证。所以一切都很好,但是不再需要HTTPS,密码可以明文发送!

我在这里做错了什么?

多亏了乔恩的回答,我可以尝试不同的解决方案。我找到了这个问题并将答案应用于我的情况:

在主目录中,.htaccess 包含

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "www.example.com"
ErrorDocument 403 https://www.example.com/admin/
AuthType Basic
AuthName "Administration"
AuthUserFile /path/to/my/.htpasswd
Require valid-user
Satisfy all

crm子目录中,.htaccess具有:

<FilesMatch "index.php">
    Allow from all
    Satisfy any
</FilesMatch>

它在任何情况下都会强制使用SSL,并允许访问crm/index.php

这有点奇怪,因为 Satisfy 指令会影响访问限制,即使SSLRequireSSLSSLRequire影响 SSL,它们也被视为访问限制的一部分。因此,当您在允许访问 URI 而不需要有效用户的情况下通过时使用 Satisfy Any 时,它也使 SSL 访问要求成为该Any的一部分。而且由于Satisfy的选项要么是 All 要么是 Any ,你不能说"这个总是,但其他 2 个"。

您可能必须使用类似 mod_rewrite 的内容来强制 htaccess 文件中的 SSL:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

最新更新