2010-06-29 91 views
4

我使用的.htaccess被重定向为不存在的索引文件/文件夹的所有请求站点:的.htaccess国防部重写与子身份验证冲突的

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 
RewriteRule !admin/* index.php [NC,L] 

有一个文件夹“管理/”,其具有在.htaccess以下面向auth:

AuthType Basic 
AuthName "admin" 
AuthUserFile "/path/to/passwd" 
require valid-user 

添加AUTH .htaccess文件中的‘管理/’导致通过被截留在请求代替MOD-重写提供所述认证响应的。我尝试了一些尝试解决此问题的不同方法(包括:htaccess rewrite and auth conflict),但无法购买。

谢谢。

编辑:如果我已经通过验证,重写规则工作让我进入“管理/”文件夹中。所以看起来这是认证挑战,做了一些不可思议的事情。

+0

这个问题你有幸运吗? – 2012-04-20 11:58:54

回答

0

当你说你尝试了另一篇文章的解决方案时,你的代码是什么样的?

事情是这样的:

RewriteCond %{REQUEST_URI} !/admin/ 

我不明白为什么这是行不通的。

+0

我在发布这个问题之前就已经尝试过了,但它没有起作用。那是当我认为这比我知道的更多时。 的RewriteCond%{} REQUEST_FILENAME -s [OR] 的RewriteCond%{} REQUEST_FILENAME -l [OR] 的RewriteCond%{} REQUEST_FILENAME -d 的RewriteCond%{REQUEST_URI}管理员/ 重写规则^ * $ - [NC, L] RewriteRule ^。* $ index.php [NC,L] – ironkeith 2010-06-29 20:48:41

0

让我提出一个简化形式的重写规则:

RewriteCond %{REQUEST_FILENAME} !-s 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule !^admin/ index.php [NC,L] 

这并入核对/admin/路径(在.htaccess文件省略了前导斜杠)的马修的建议。

您可能还需要第一RewriteCond行之前使用

RewriteBase/

+0

我给了一个尝试,但不幸的是它没有工作(除非我从admin文件夹中删除.htaccess文件)。 另外,删除“RewriteRule ^。* $ - [NC,L]”会中断重写。 – ironkeith 2010-06-29 20:52:04

+0

它是如何打破的? – 2010-06-29 20:53:35

+0

它不再将请求重定向到index.php文件。他们都只有404'd。 – ironkeith 2010-06-29 21:48:22

5

我有同样的问题,我也发现了此相关的问题:htaccess rewrite and auth conflict

一个人也没有避让我到我的问题的答案。 Apache正试图为401错误找到一个文档并且失败。我添加了一个文档/401.html,并使用Auth语句将其添加到.htaccess文件中。

ErrorDocument 401 /401.html

现在,它适用于我!

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; 
}; 

?> 
0

做如果你GOTS mod_dir这增加了当时的forwardslashes服务器/上运行时与一个文件夹重写规则冲突如mydomain/mypage /文件夹名称mod_dir在文件夹名称末尾添加一个前向空格/因为它是一个真正的目录,如果您的规则在htaccess中指定不遵循索引(Options -Indexes)并且文件夹中没有任何内容,那么您的规则会好的,如果在索引以外的文件夹中有东西,那么期望这发生在你的url:mydomain/mypage/foldername /?请求=我的页面/文件夹名称

由于这是cPanel的默认配置,因此问题不是您的错,这是配置中的一个大规模冲突,它使黑客能够识别脚本请求和目录结构。

如果您无法在服务器的http.conf中禁用多视图,我没有任何解决方案,因为大多数htacces解决方案都会导致重定向循环。

这是一个未报告的cPanel冲突/错误,所以不要屏住呼吸寻求解决方案,工作环境可以将您的wntire项目嵌套在单个文件夹中并在内部调用页面。