Аутентификация PHP Realm в Windows IIS 7.5

Мне нужно использовать аутентификацию области в папке на сайте PHP, работающем на веб-сервере Windows IIS 7.5. У меня есть следующий код ниже, который отлично работает с любым файлом .php в этом каталоге.

Проблема в том, что мне нужно защитить паролем доступ ко всему каталогу, включая PDF, файлы изображений, файлы css и т. д. Я не могу размещать PHP-код в этих типах файлов.

У меня был установлен модуль перезаписи IIS на сервере, поэтому я предполагаю, что могу каким-то образом добавить перезапись в свой web.config, который может принудительно заставить все файлы проходить через какой-то проходной/обработчик PHP-файл.

Я просто понятия не имею, как это сделать.

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Jonas Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'User pressed Cancel';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>";
}
?>

person TroySteven    schedule 26.10.2015    source источник


Ответы (1)


Я ответил на похожий вопрос, и разница в том, что вы используя ISS, а не Apache, и вы хотите обслуживать все файлы, а не только несколько типов.

Вот полный web.config или вы можете просто скопировать тег <rule>. Это правило будет соответствовать всем файлам, кроме файлов с расширением php (пожалуйста, не negate=true). Вам придется изменить его в соответствии с вашими конкретными требованиями.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <directoryBrowse enabled="false" />
    <rewrite>
      <rules>
            <rule name="Authentication" stopProcessing="false">
                <match url="^(.*)$" negate="false" />
                <action type="Rewrite" url="validate.php?path={R:0}" appendQueryString="true" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" />
                    <add input="{QUERY_STRING}" pattern="^(.*\.php)$" negate="true" />
                </conditions>
            </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

А вот другая версия файла isAuthenticated.php, которую я использовал, и в ней используется часть кода, который вы разместили.

$blacklistExtensions = array();

$path = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR.$_REQUEST["path"];
$pathInfo = pathinfo($path);

if(in_array($pathInfo["extension"], $blacklistExtensions)) {
    header("HTTP/1.1 403 Forbidden");
    exit;
}

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Jonas Realm"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
}

if(!file_exists($path)) {
    header("HTTP/1.1 404 Not Found");
    exit;
}

// Display the file and set the correct mimetype
$resource = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($resource, $path);
finfo_close($resource);

header("Content-Type: ".$mimetype);
readfile($path);

Надеюсь, это поможет вам начать поиск решения этой проблемы :)

person Ricardo Velhote    schedule 09.11.2015