Перезапись мода .htaccess конфликтует с аутентификацией подпапки - PullRequest
4 голосов
/ 30 июня 2010

У меня есть сайт, который перенаправляет все запросы на файлы / папки, которые не существуют, в индексный файл, используя .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 для auth:

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

Добавление файла auth .htaccess в "admin /" приводит к тому, что запрос перехватывается с помощью mod-rewrite вместо предоставления ответа аутентификации.Я пробовал несколько разных вещей, пытаясь обойти это (в том числе: переписывание htaccess и конфликт аутентификации ), но не смог получить какую-либо покупку.

Спасибо.

РЕДАКТИРОВАТЬ: Если я уже аутентифицирован, правило перезаписи работает , позволяя мне получить доступ к папке «admin /».Похоже, что проблема аутентификации делает что-то нехорошее.

Ответы [ 5 ]

5 голосов
/ 09 июня 2013

У меня был тот же вопрос, и я также нашел этот связанный вопрос: Переписывание htaccess и конфликт аутентификации

Один из ответов там подсказал мне мою проблему.Apache пытался найти документ об ошибке 401 и не смог.Я добавил документ /401.html и добавил его в файл .htaccess с инструкциями Auth.

ErrorDocument 401 /401.html

Теперь это работает для меня!

1 голос
/ 27 ноября 2013

Если ничего из вышеперечисленного не подходит для вашего сценария, базовую аутентификацию также можно выполнить с помощью сценария 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 голосов
/ 09 октября 2014

Если вы запускаете mod_dir на сервере, который добавляет превалирующие косые черты / когда ваше правило перезаписи конфликтует с такой папкой, как mydomain / mypage / foldername, то mod_dir ударяет прямую черту в конце foldername /, поскольку это настоящий каталог, есливаши правила указывают в htaccess, что они не следуют за индексами (Опции -Indexes), и в папке ничего нет, тогда ваши правила будут в порядке, если в папке есть что-то, кроме индекса, то ожидайте, что это произойдет с вашим URL: mydomain/ mypage / foldername /? request = mypage / foldername

Поскольку это конфигурация cPanel по умолчанию, проблема не в вашей ошибке, это серьезный конфликт в конфигурации, который позволяет хакерам идентифицировать запросы скриптов и структуры каталогов.

У меня нет решения, если вы не можете отключить множественные просмотры в http.conf сервера, так как большинство решений htacces приводят к циклу перенаправления.

Это незарегистрированный конфликт /ошибка в cPanel, так что не задерживайте дыханиеВ качестве решения проблемы можно обойтись без вложений проекта wntire в одну папку и вызывать внутренние страницы.

0 голосов
/ 30 июня 2010

Позвольте мне предложить упрощенную форму для правил переписывания:

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

Сюда входит предложение Мэтью проверить путь по /admin/.htaccess файлах вы опускаете начальный слеш).

Возможно, вам также понадобится использовать

RewriteBase /

перед первой строкой RewriteCond.

0 голосов
/ 30 июня 2010

когда вы говорите, что пробовали решение из другого поста, как выглядел ваш код?

Примерно так:

RewriteCond %{REQUEST_URI} !/admin/

Я не понимаю, почему это не такт работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...