使用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
指令会影响访问限制,即使SSLRequireSSL
和SSLRequire
影响 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]