7

我正在尝试~/public_html/dev使用 http auth basic 保护目录,但为了确保安全,我想通过 ssl 运行它。

.htaccess如果请求 URI 以开头并且有效,则以下文件的中间部分将切换到 https /dev

该文件的最后一部分也可以正常工作,但不能与 https 重定向一起正常工作。

我基本上希望能够键入http://www.example.com/dev/some_sub_dir/并被重定向到https://www.example.com/dev/some_sub_dir/并提示输入 http auth 用户名和密码。

当前发生的情况是,如果我http://www.example.com/dev/some_sub_dir/通过端口 80 提示输入用户名和密码,然后立即通过端口 443 再次提示。所以我的凭据被发送两次,一次是明文,一次是加密。使整个 https url 重写有点毫无意义。

这样做的原因是我不会不小心提交我的用户/通过 http;https 将始终用于访问/dev目录。

.htaccess是在目录~/public_html/dev中。

# 重写 example.com 的规则
重写引擎开启
RewriteBase /

# 通过 https 强制 /dev
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} ^/dev
重写规则 (.*) https://%{HTTP_HOST}%{REQUEST_URI}

# 进行身份验证
AuthType 基本
身份验证名称“开发”
AuthUserFile /home/matt/public_html/dev/.htpasswd
需要有效用户
4

9 回答 9

11

在进行基本身份验证之前,有一个相对流行的 hack 来强制使用 HTTPS。我第一次看到这里:

http://blog.jozjan.net/2008/02/htaccess-redirect-to-ssl-https-before.html

它涉及使用自定义错误文档来处理 HTTPS 检查失败后发生的任何事情。

例如,我有一个页面需要强制启用 HTTPS,所以我在 .htaccess 文件中执行了此操作:

<FilesMatch "secure-page.php">
    SSLRequireSSL
    ErrorDocument 403 https://www.example.com/secure-page.php
    AuthType Basic
    AuthName "Secure Page"
    AuthUserFile /var/www/whatever/.htpasswdFile
    Require valid-user
</FilesMatch>

翻译为:

如果请求的页面是“secure-page.php”——如果不是 HTTPS,则重定向到自定义“错误页面”——“错误页面”实际上只是页面的 HTTPS 版本——在第二个请求中,因为 HTTPS现在检查通过,执行基本身份验证:)

您可以将此概念扩展到目录或其他用例 - 您的自定义“错误页面”可以是重定向到正确 HTTPS URL 的 php 页面,也可以是上面链接中的 CGI 脚本...

于 2012-12-04T17:39:44.453 回答
4

我遇到了同样的问题,最后找到了一个丑陋的解决方案,但它确实有效。将重写规则放在 httpd.conf 或您的 conf.d 文件之一的 Directory 指令中(即,在“主”服务器配置中)。然后,将 Auth* 和 Require 行放在ssl.conf 中容器的Directory 指令<VirtualHost _default_:443>中(或定义 SSL VirtualHost 的任何位置)。

对我来说,这意味着创建一个文件/etc/httpd/conf.d/test.conf

<Directory "/var/www/html/test">
        #
        # force HTTPS
        #
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Directory>

...然后在标签/etc/httpd/conf.d/ssl.conf上方添加以下内容:</VirtualHost>

<Directory "/var/www/html/test">
        #
        # require authentication
        #
        AuthType Basic
        AuthName "Please Log In"
        AuthUserFile /var/www/auth/passwords
        Require valid-user
</Directory>

这样做会使 Apache 将 RewriteRule 应用于所有请求,而 auth 要求仅应用于 443 VirtualHost 中的请求。

于 2010-02-25T22:07:00.370 回答
4

在siliconrockstar 的回答的基础上,我添加了一个php 脚本,它适用于您想要对所有文件强制使用SSL 的情况,而不仅仅是siliconrockstar 显示的单文件情况。在这里,它再次与 htaccess 文件一起工作。

保护整个目录的 htaccess:

    SSLRequireSSL
    ErrorDocument 403 /yourphp.php
    AuthType Basic
    AuthName "Secure Page"
    AuthUserFile /some_path_above_the_html_root/.htpasswdFile
    Require valid-user

htaccess 调用的 php(此示例 htaccess 中为 php 提供的路径是您网站的根目录),这会在您调用的 url 上强制使用 https:

<?php
$path = "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
if ( $_SERVER['SERVER_PORT'] == 80) {
    header("Status: 302 Moved\n");
    header("Location: ".$path."\n\n");
}
else {
    header( "Content-type: text/html\n\n");
    echo "How did you get here???";
}
?>

如果您的站点没有 SSL 证书,则必须安装一个。如果这是您唯一的用途,您可以安装自签名证书。在 cPanel VPS 上,您的站点位于专用 IP 上,这需要一些时间:在 WHM 中,访问

一。生成 SSL 证书和签名请求

然后

二。在域上安装 SSL 证书

于 2013-07-06T01:09:24.593 回答
2

使用基本身份验证保护内容永远不会通过 HTTP 安全地工作。

一旦用户输入了他们的用户名和密码,它就会被发送到该站点的每个页面视图的未加密 - 它不仅仅是在用户收到提示时发送。

您必须将通过 HTTP 的请求视为未经身份验证的,并通过 HTTPS执行所有登录操作。

许多网站使用 HTTPS 进行登录——使用表单和 cookie,而不是基本身份验证——然后再使用 HTTP。这意味着他们的“您已登录”cookie 未加密发送。由于这个原因,每个有价值的目标都被黑客入侵了,gmail 现在正在切换到完整的 HTTPS,其他目标也会随之而来。

您没有其他人遇到的相同的扩展问题,这些问题使他们远离计算成本更高的 HTTPS。如果您的主页支持 HTTPS 访问,请始终使用它。

于 2010-02-08T07:48:53.330 回答
1

如果您将重写规则放在主配置中,在任何或类似之外,重写将在身份验证之前完成。

重写技术

于 2011-02-04T16:13:27.667 回答
0

使用协议作为术语将您的身份验证部分放在一个<Location>或标签中是否有效?<LocationMatch>

于 2010-02-08T08:09:34.577 回答
0

我以这种方式绕过它。只允许非 SSL,因为它将被重定向,然后需要在 SSL 上进行一次身份验证...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL

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

AuthUserFile /.htpasswd
AuthName "Enter your Username and Password:"
AuthType Basic
require valid-user
Allow from env=IS_NON_SSL
于 2013-04-11T03:54:17.403 回答
0

我知道这是一个老问题,但我在使用简单的 ht.access 重定向时遇到了麻烦。在许多其他问题和答案之后,我终于把这个按预期工作的 htaccess 放在一起。

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

AuthName "Private Server"
AuthUserFile /var/www/.htpassword
AuthType Basic
require valid-user
Order allow,deny
Allow from env=!HTTPS
Satisfy Any

要注意

Order allow,deny

这是我见过的许多其他答案所缺少的,因为它允许人们在使用 https 时直接进入。我的测试中缺少的另一部分如下:

Satisfy Any

以下代码段允许非 SSL 客户端使用重定向。HTTPS env var 是从 mod_ssl 为 ssl 客户端设置的。

Allow from env=!HTTPS
于 2013-11-16T09:14:00.907 回答
0

我对这个问题有两个答案,一个是 2010 年的心态,一个是 2012 年后的心态。

要像 2010 年那样回答这个问题:使用两种不同的 VirtualHost 配置。

这个解决方案有点超出问题的范围,因为这意味着“我只能修改.htaccess!” 但在许多情况下,一个可行的解决方案是要求管理员 du jour 简单地设置两个不同的 VirtualHost 配置。

  • 非 SSL 虚拟主机未配置为访问文件系统上的任何内容,并且仅返回 301 重定向到https://...所有请求的位置。

  • SSL 监听 VirtualHost 然后可以自由地实现基本身份验证,而不必担心标准 HTTP 监听器会泄露货物。

然而,我在 2018 年后的帽子,并注意到这个问题是在 Apache 2.4(2012 年初?)之前提出的,是时候进行更新了。Apache 2.4 引入了<If condition>检查,这使得这更容易和更直接:

  • 首先,不要IfModule RewriteEngine。由于 Apache 正在侦听端口 80 和 443(在标准设置中),并且我们希望强制执行 SSL,因此如果 Rewrite 模块以其他方式脱离,我们希望服务器中断。

    RewriteEngine On 
    
  • 其次,很简单,如果请求不安全,则执行立即和永久 (301) 重定向。请注意 R(edirect) 和 L(ast) 一起工作以确保未加密的请求被重定向并且不能用于获得未经过身份验证的访问。(对于强迫症,不考虑复制粘贴,请注意 和之间缺少空格。这是故意的。)!=on

    RewriteCond %{HTTPS} !=on 
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]
    
  • 最后,使用相同的变量进行<If-condition>检查,以确保我们只需要 TLS 请求的密码。

    <If "%{HTTPS} == 'on'">
            AuthName "Password please!" 
            AuthType Basic 
            AuthUserFile /path/to/htpasswdfile
            AuthGroupFile /dev/null 
            require valid-user
    </If>
    

总的来说:

# .htaccess

RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,QSA,L,NC]

<If "%{HTTPS} == 'on'">
        AuthName "Password please!"
        AuthType Basic
        AuthUserFile /path/to/htpasswdfile
        AuthGroupFile /dev/null
        require valid-user
</If>
于 2018-03-16T19:31:35.820 回答