2010-06-29 88 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項目嵌套在單個文件夾中並在內部調用頁面。