我有一个网站,使用.htaccess将所有不存在的文件/文件夹请求重定向到索引文件:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule !admin/* index.php [NC,L]
有一个文件夹“admin /”,其中包含以下.htaccess for auth:
AuthType Basic
AuthName "admin"
AuthUserFile "/path/to/passwd"
require valid-user
在“admin /”中添加auth .htaccess文件会导致请求被mod-rewrite捕获,而不是提供身份验证响应。我尝试了一些不同的方法试图解决这个问题(包括:htaccess rewrite and auth conflict),但无法进行任何购买。
感谢。
编辑:如果我已经过身份验证,则重写规则可以允许我访问“admin /”文件夹。因此,似乎是认证挑战正在做一些不可思议的事情。
答案 0 :(得分:5)
我有同样的问题,我也发现了这个相关的问题:htaccess rewrite and auth conflict
其中一个答案让我想到了我的问题。 Apache试图找到401错误的文档并失败。我添加了一个文档/401.html并使用Auth语句将其添加到.htaccess文件中。
ErrorDocument 401 /401.html
现在,它对我有用!
答案 1 :(得分:1)
如果以上都不适合您的方案,也可以使用php脚本
完成基本身份验证<?php
session_start();
if (isset($_SESSION['newlogin'])) {
unset($_SESSION['newlogin']);
unset($_SESSION['loggedout']);
};
$valid_passwords = array ("admin" => "mypass");
$valid_apasswords = array ("admin" => "mypass");
$valid_users = array_keys($valid_passwords);
$valid_admin = array_keys($valid_apasswords);
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
$avalidated = (in_array($user, $valid_admin)) && ($pass == $valid_apasswords[$user]);
$uvalidated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);
$validated = (($uvalidated == true) || ($avalidated == true)) ;
if (!$validated || isset($_SESSION['loggedout'])) {
$_SESSION['newlogin'] = true;
header('WWW-Authenticate: Basic realm="Login Area"');
header('HTTP/1.0 401 Unauthorized');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<div id="messagebox">Authorisation Required.</div>
</body>
</html>
<?php
exit;
};
?>
答案 2 :(得分:0)
当你说你试过其他帖子的解决方案时,你的代码是什么样的?
这样的事情:
RewriteCond %{REQUEST_URI} !/admin/
我不明白为什么那样不起作用。
答案 3 :(得分:0)
让我建议一个简化的重写规则表格:
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^admin/ index.php [NC,L]
这包含了Matthew关于检查/admin/
路径的建议(在.htaccess
文件中省略了前导斜杠)。
您可能还需要使用
RewriteBase /
在第一行RewriteCond
之前。
答案 4 :(得分:0)
如果你在服务器上运行mod_dir,这会增加盛行的forwards:当你的重写规则与mydomain / mypage / foldername这样的文件夹冲突时,mod_dir会在foldername /的末尾打一个forwardslash,因为它是一个真正的dir,如果你的规则在htaccess中指定不遵循索引(Options -Indexes)并且文件夹中没有任何内容然后你的规则就可以了,如果文件夹中除了索引之外还有其他东西,那么预计这会发生在你的url:mydomain /我的空间/ FOLDERNAME /?请求=我的空间/文件夹名
由于这是cPanel的默认配置,因此问题不是您的错,这是一个巨大的配置冲突,使黑客能够识别脚本请求和目录结构。
如果您无法在服务器的http.conf中禁用多视图,我没有任何解决方案,因为大多数htacces解决方案都会导致重定向循环。
这是cPanel未报告的冲突/错误,所以不要屏住呼吸解决方案,可以将你的wntire项目嵌套在一个文件夹中并在内部调用页面。