7

我试图用http auth basic保护~/public_html/dev目录,但为了确保安全,我想通过ssl来运行它。通过HTTPS进行通过URL重写进行HTTP身份验证

如果请求URI以/dev开始并且正常工作,则以下.htaccess文件的中间部分切换到https。

该文件的最后一部分工作正常,但无法正确使用https重定向。

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

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

这样做的原因是,我不会无意中通过http提交我的用户/密码; https将永远用于访问/dev目录。

.htaccess位于~/public_html/dev目录中。

# Rewrite Rules for example.com 
RewriteEngine On 
RewriteBase/

# force /dev over https 
RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^/dev 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

# do auth 
AuthType Basic 
AuthName "dev" 
AuthUserFile /home/matt/public_html/dev/.htpasswd 
Require valid-user

回答

10

有一个比较流行的黑客做的基本身份验证之前强制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检查现在通过,执行Basic验证:)

您可以将此概念扩展到目录或其他用途案例 - 您的自定义'错误页面'可能是一个重定向到正确的HTTPS URL或上述链​​接中的CGI脚本的PHP页面...

+0

,这很漂亮 – Matthew 2012-12-05 09:41:28

+0

是的,可能不是最佳解决方案,但经过四个小时发现自己处于和你一样的困境中,它是最好的解决方案我可以找到:) – siliconrockstar 2012-12-06 22:20:33

+0

我试了一下,然后一些;这个解决方案对我来说最合适。我删除了FilesMatch指令,然后验证了所有内容 - 如果访问者未定义文件(例如, index.php文件。 http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html也会给你很多好的信息;基于此,我还包含SSLOptions + StrictRequire – Praesagus 2013-03-18 23:43:57

2

使用基本身份验证保护内容将无法安全地通过HTTP进行。

一旦用户输入了他们的用户名和密码,它将以不加密的方式发送到每个网页浏览到该网站 - 它不只是发送用户提示的时间。

您必须通过HTTP将请求视为未经过身份验证,并且通过HTTPS登录的所有都是

很多网站都使用HTTPS进行登录 - 使用表单和Cookie,而不是基本身份验证 - 然后转到HTTP。这意味着他们'你已登录'的cookie会以未加密方式发送。每个有价值的目标都因此而遭到黑客攻击,而且gmail现在正在切换到完整的HTTPS,其他的则会随之而来。

您没有与其他人一样的缩放问题,导致他们远离计算成本更高的HTTPS。如果您的主页支持HTTPS访问,请始终使用它。

+0

它让我感到困惑,在重新阅读这个问题时,你好像知道我写的建议;然而,我认为它对其他人稍后阅读线索以查看我的理由有用,所以我会让它留下。 – Will 2010-02-08 08:10:23

+1

你甚至读过这个问题吗?他希望通过HTTPS使用HTTP身份验证。但是,身份验证发生在从HTTP到HTTPS的重定向之前。因此,请求* http://example.com/dev/...*提示身份验证,然后发生重定向并请求* https://example.com/dev/...*提示另一个身份验证。他想要的是首先重定向,然后提示认证。 – Gumbo 2010-02-08 08:12:07

+0

@Gumbo yeap我在第二次阅读时选择了它,并将其注释为 – Will 2010-02-08 08:24:02

0

是否将您的验证部分放在使用协议作为术语的<Location><LocationMatch>标记中?

4

我遇到了同样的问题,并最终找到了一个难看的解决方案,但它的工作原理。将重写规则放置在httpd.conf或其中一个conf.d文件(即“Main”服务器配置)中的Directory指令中。然后,在ssl.conf(或您的SSL VirtualHost定义的任何位置)将Auth *和Require行放置在Directory指令内的<VirtualHost _default_:443>容器内。

对于我来说,这意味着创建一个文件/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> 

...然后加入刚好</VirtualHost>上面的标签里面/etc/httpd/conf.d/ssl.conf如下:

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

这样做可以使Apache的应用重写规则所有的请求,并且认证要求,只有在443虚拟主机的请求。

1

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

Rewrite Tech

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 
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给出的路径是你的站点的根目录),这迫使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证书

0

我知道这是一个老问题,但我遇到了一个简单的问题。访问重定向。在我遇到许多其他问题和答案之后,我终于把这个按预期工作的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 
+1

这不起作用,它只是允许所有流量通过 – nbsp 2015-03-04 23:36:59

相关问题