Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 通过HTTPS强制进行HTTP身份验证_Apache_.htaccess_Mod Rewrite_Url Rewriting_Http Authentication - Fatal编程技术网

Apache 通过HTTPS强制进行HTTP身份验证

Apache 通过HTTPS强制进行HTTP身份验证,apache,.htaccess,mod-rewrite,url-rewriting,http-authentication,Apache,.htaccess,Mod Rewrite,Url Rewriting,Http Authentication,我有一个我的网站,我想安全目录。我使用.htaccess文件强制进行HTTP身份验证。我想强制通过HTTPS完成此HTTP身份验证 看看关于堆栈溢出的各种解决方案,这里是我的重点: 我在“top_secret”目录中有以下.htaccess文件: SSLRequireSSL ErrorDocument 403 /rd.php AuthType Basic AuthName "Secure Page" AuthUserFile "/home/usr/.htpasswds/public_html/t

我有一个我的网站,我想安全目录。我使用.htaccess文件强制进行HTTP身份验证。我想强制通过HTTPS完成此HTTP身份验证

看看关于堆栈溢出的各种解决方案,这里是我的重点:

我在“top_secret”目录中有以下.htaccess文件:

SSLRequireSSL
ErrorDocument 403 /rd.php
AuthType Basic
AuthName "Secure Page"
AuthUserFile "/home/usr/.htpasswds/public_html/top_secret/passwd"
Require valid-user
<?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 '?';
}
?>
然后,我的根目录中有“rd.php”:

SSLRequireSSL
ErrorDocument 403 /rd.php
AuthType Basic
AuthName "Secure Page"
AuthUserFile "/home/usr/.htpasswds/public_html/top_secret/passwd"
Require valid-user
<?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 '?';
}
?>

这在我的台式计算机上运行得很好,但是当我在safari中从iphone浏览到top_secret目录(到HTTPS或HTTP地址)时,我只得到一个问号。因此,出于某种原因,php文件的else条件正在输出


我不太清楚这意味着什么以及如何解决,任何帮助都将不胜感激

我建议您在web服务器层实现它,而不是在PHP中实现它。将其添加到
.htaccess
文件的顶部:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
并删除PHP重定向代码

但这仍然需要在发出重定向之前登录,并且不安全地传输详细信息。您真正需要的是Apache中的两个
块。一个用于将目录请求重定向到HTTPS的端口80,另一个用于配置了HTTP身份验证的端口443

更新


此外,在用作403错误文档的文档中尝试发出302重定向也是没有意义的,因为状态代码已经设置,并且该文档仅用于生成该响应的主体,因此它现在无法将响应代码更改为302,因为它已经设置为403。我上面概述的方法将起作用,或者您可以简单地拒绝HTTP请求并仅为该目录提供HTTPS。

如果您支持beanstalk或任何loadbalancer,则可以在该级别上设置重定向。否则写入@SuperDuperApps建议的.htaccess配置。这应该是一个评论,但我没有足够的代表;-)

我已经回答了你的问题。如果你对我的回答不满意,你能告诉我原因吗?我会更新它或解决你的问题?谢谢,你只是想浪费你的赏金吗?我愿意为你更新我的答案,但是,如果没有您的反馈,就无法做到这一点。假设safari浏览器通过HTTPS从
Require
指令获得403,因为
AuthType Basic
的行为不正确。您可能应该将此作为一条评论写在您所指的帖子下面。我只是想帮忙,我没有评论的名声,你为什么不投票?我没说错吧?我浪费时间回答你?你?啊,没有看到你没有足够的声誉发表评论-很好,如果你编辑你的帖子,我会取消否决票:)现在你几乎有足够的代表:-)我对这篇文章投了更高的票,@JohnGallagher我编辑了这篇文章,所以也许你现在可以这样做。嗨,SuperDuperApps,对于我迟来的回复,我深表歉意,并感谢您在这个问题上的帮助。这是一个很好的选择,但正如您所说,它需要2次身份验证,其中一次以明文形式发送(我希望避免)。此外,当我运行此命令时,会出现代码500的服务器错误。您是否有可能向我提供进一步的文档,详细说明如何按照您的描述设置virtualhosts?对于500内部服务器错误,请查看您的错误日志以了解问题所在。对于在Apache中设置虚拟主机,有以下几种方法。这取决于你的设置,你需要如何做。如果您有任何问题,那么您可以打开一个新的问题并发布一些配置文件。