0

使用 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,并且可以明文发送密码!

我在这里做错了什么?

4

2 回答 2

1

感谢乔恩的回答,我可以尝试不同的解决方案。我发现了这个问题并将答案应用于我的情况:

在主目录中, .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.

于 2012-08-15T21:07:36.563 回答
0

这有点奇怪,因为该Satisfy指令会影响访问限制,即使SSLRequireSSLandSSLRequire影响 SSL,它们也被视为访问限制的一部分。因此,当您Satisfy Any在不需要有效用户的情况下允许对 URI 的访问时使用时,它也会这样做,因此 SSL 访问要求是其中的一部分Any。并且由于选项SatisfyAllor 或Any,因此您不能说“总是这个,但其他 2 任意”。

您可能必须使用 mod_rewrite 之类的东西来强制在您的 htaccess 文件中使用 SSL:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
于 2012-08-12T23:26:06.117 回答