在请求用户身份验证之前,Apache .htaccess重定向到HTTPS

ced*_*vad 27 apache .htaccess

这是我的.htaccess:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthUserFile /etc/hi
AuthName "hi"
AuthType Basic
require valid-user
Run Code Online (Sandbox Code Playgroud)

它要求使用http进行用户身份验证,这意味着密码将以纯文本形式发送.它将重定向到https版本并再次询问密码.

我该如何解决?

Mol*_*mby 15

如果您正在运行Apache 2.4,则可以使用配置部分轻松解决此问题.

例如...

# Redirect to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# Authenticate users only when using HTTPS
# Enable for <v2.4
 # SSLRequireSSL
 # ErrorDocument 403 /secure-folder/
# Enable for >v2.4
<If "%{HTTPS} == 'on'">
    AuthType Basic
    AuthName "Special things"
    AuthUserFile /etc/blah.htpasswd
    # Prevent this 'Require' directive from overriding any merged previously
   <IfVersion >= 2.4>
      AuthMerging And
   </IfVersion>
    Require valid-user
# Enable for >v2.4
</If>
Run Code Online (Sandbox Code Playgroud)

  • *绝对不要这样做.*由于指令合并顺序(`<If>`最后合并),经过身份验证的用户可以访问以前用`<Directory>`或`<File>阻止的任何文件或目录. !例如,在普通服务器设置上,`.htaccess`文件将被授予对有效用户的访问权限. (6认同)
  • @Alek,我添加了一个'AuthMerging'指令,我认为它解决了你提出的问题.因此,所有访问者仍然被重定向到HTTPS,但是任何HTTPS请求都要求访问者*对以前合并的<file>或<directory>指令添加的现有限制进行身份验证*.你怎么看? (4认同)
  • 我没有测试这个设置,但从文档中看起来没问题,所以我会接受你的话. (3认同)
  • @Molomby,请删除内联注释:[注释可能**不会与配置指令包含在同一行.](http://stackoverflow.com/a/22107065/4829915) (2认同)

小智 14

我这样绕过它.只允许非SSL,因为它将被重定向,然后在SSL上需要auth一次...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

AuthUserFile /etc/hi
AuthName "hi"
AuthType Basic
require valid-user
Allow from env=IS_NON_SSL
Run Code Online (Sandbox Code Playgroud)

  • 至少在我的情况下,它仍然需要两次身份验证. (4认同)
  • 这不起作用.(Apache 2.2) (4认同)
  • 一个不完全明显的问题的优雅解决方案.我最终使用了"允许来自env =!HTTPS",其中在SSL请求中设置了HTTPS,但同样的概念适用.谢谢. (2认同)
  • 根据http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif上的文档,SERVER_PORT不是SetEnvIf指令中可用的选项 (2认同)

小智 10

非常感谢,Istador!

我的Apache版本为2.2(Synology NAS DSM 5.1),所以这两个不适用于它:

RewriteOptions Inherit
IfVersion
Run Code Online (Sandbox Code Playgroud)

拿出它们(以及版本> = 2.4的部分)后.整件事开始为我工作.

对于这个主题有很多建议,我花了两天时间试用它们.

但只有这一个适合我.

这是我做的:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

AuthType Basic
AuthName "private area"
AuthUserFile /path/to/file/.htdigest

Order Deny,Allow
Deny from all
Satisfy Any
Allow from env=!HTTPS
Require valid-user
Run Code Online (Sandbox Code Playgroud)

因此,它已经过验证,适用于Apache 2.2,Synology DSM 5.1.

  • @Ilya."谢谢"是有帮助的,因为帖子与他们的特定帖子有关,这有助于为像我这样的读者提供上下文.没有它,读者可能会认为它只是直接处理OP的帖子.当然,他们可以做一个'@Istador'更简洁! (2认同)
  • 这似乎不适用于我拥有的基于 Debian 的 2.2 版本 - `Allow from env=!HTTPS` 似乎没有效果,导致所有页面都绕过身份验证步骤。 (2认同)