.htaccess mod-rewrite与子文件夹auth冲突

时间:2010-06-29 20:17:17

标签: authentication .htaccess mod-rewrite

我有一个网站,使用.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 /”文件夹。因此,似乎是认证挑战正在做一些不可思议的事情。

5 个答案:

答案 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项目嵌套在一个文件夹中并在内部调用页面。