2010-06-29 10 views
4

sous-dossier J'ai un site qui redirige toutes les demandes de fichiers/dossiers qui n'existent pas dans un fichier d'index en utilisant .htaccess:mod-rewrite .htaccess en conflit avec auth

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

Il y a un dossier « admin/» qui a ce qui suit dans .htaccess pour auth:

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

Ajout du fichier .htaccess auth « admin/» provoque la demande d'être pris au piège par mod-rewrite au lieu de fournir la réponse d'authentification. J'ai essayé quelques choses différentes essayant de contourner ceci (y compris ceci: htaccess rewrite and auth conflict), mais n'ai pu obtenir aucun achat.

Merci.

EDIT: Si je suis déjà authentifié, la règle de réécriture fonctionne me permettant d'accéder au dossier "admin /". Donc, il semble que c'est le défi de l'authentification qui fait quelque chose de bancal. Lorsque vous dites avoir essayé la solution de l'autre poste, à quoi ressemblait votre code?

+0

Avez-vous eu de la chance avec ce problème? –

Répondre

0

Quelque chose comme ceci:

RewriteCond %{REQUEST_URI} !/admin/ 

Je ne vois pas pourquoi cela ne fonctionnerait pas.

+0

J'ai essayé exactement cela avant de poster cette question, et cela n'a pas fonctionné. C'est à ce moment-là que je me suis dit que ça se passait plus que je ne le savais. RewriteCond% {} REQUEST_FILENAME -s [OR] RewriteCond% {REQUEST_FILENAME} -l [OR] RewriteCond% {REQUEST_FILENAME} -d RewriteCond% {REQUEST_URI} admin/ RewriteRule^* $ -. [NC, L] RewriteRule ^. * $ Index.php [NC, L] – ironkeith

0

Laissez-moi suggérer une forme simplifiée pour les règles de réécriture:

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

Cette suggestion de incorpore Matthieu de vérifier le chemin contre /admin/ (dans .htaccess fichiers que vous omettez le slash).

Vous pourriez aussi avoir besoin d'utiliser un

RewriteBase/

avant la première ligne RewriteCond.

+0

J'ai essayé, mais malheureusement cela n'a pas fonctionné (sauf si j'ai supprimé le fichier .htaccess du dossier admin). En outre, supprimer "RewriteRule ^. * $ - [NC, L]" interrompt la réécriture. – ironkeith

+0

Comment ça s'est cassé? –

+0

Il ne redirige plus les demandes vers le fichier index.php. Ils ont tous juste 404'd. – ironkeith

5

J'ai eu cette même question, et je trouve aussi cette question connexe: htaccess rewrite and auth conflict

L'une des réponses, il me Clued dans mon problème. Apache essayait de trouver un document pour l'erreur 401 et échouait. J'ai ajouté un document /401.html et l'ai ajouté au fichier .htaccess avec les instructions Auth.

ErrorDocument 401 /401.html

Maintenant, ça marche pour moi!

1

Si aucun des travaux ci-dessus pour votre scénario, l'authentification de base peut également être effectuée en utilisant un script 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

Si vous GOTS mod_dir en cours d'exécution sur le serveur qui ajoute forwardslashes en vigueur/lorsque vos conflits de règles de réécriture avec un dossier tel que mydomain/mypage/foldername le mod_dir slaps une barre oblique à la fin de foldername/comme un vrai dir, si vos règles spécifient dans le htaccess pour ne pas suivre les index (Options -Indexes) et il n'y a rien dans le dossier alors votre les règles seront correctes, s'il y a quelque chose dans le dossier autre qu'un index alors attendez que cela arrive à votre url: mydomain/mypage/foldername /?request = mypage/foldername

Comme il s'agit de la configuration par défaut de cPanel, le problème n'est pas de votre faute, c'est un conflit massif dans la configuration qui permet aux pirates informatiques d'identifier les demandes de script et les structures de répertoires.

Je n'ai aucune solution si vous ne pouvez pas désactiver multiviews dans le http.conf du serveur car la plupart des solutions htacces résultent en une boucle de redirection. Ceci est un conflit/bug non rapporté à cPanel alors ne retenez pas votre souffle pour une solution, une solution de travail pourrait être d'imbriquer votre projet wntire dans un seul dossier et appeler les pages en interne.