Рейтинг:3

.htaccess — исключить папку из базовой защиты авторизации

флаг id

У меня есть веб-сайт, на который никому не разрешено входить без ввода основных учетных данных.

Однако мне нужно, чтобы медиа-папка была доступна всем, потому что мы используем стороннее расширение, которое создает PDF-файлы, и мы можем полностью протестировать их только в том случае, если медиа-файл доступен.

Медиа-папка находится по адресу /var/www/company/pub/media.

Домен (www.example.com) указывает на /var/www/компания/паб, Итак паб папка является точкой входа.

Это моя попытка .htaccess (/var/www/компания/.htaccess):

RewriteEngine включен
RewriteCond %{REQUEST_URI} !^/pub/
RewriteCond %{REQUEST_URI} !^/setup/
RewriteCond %{REQUEST_URI} !^/update/
RewriteCond %{REQUEST_URI} !^/dev/
Правило перезаписи .* /pub/$0 [L]
DirectoryIndex index.php

Основной тип авторизации
Имя авторизации "Защищено"
AuthUserFile "/var/www/company/.htpasswd"

# Исключить папку мультимедиа из базовой аутентификации
SetEnvIf Request_URI "^/media/*" носитель

Порядок разрешить, запретить
Требовать действительного пользователя
Разрешить из env=media
Запретить от env=!media
Удовлетворить любой

Но если я попытаюсь позвонить http://www.example.com/media/someimage.jpg тогда я все еще получаю приглашение для входа в систему.

Среда:

Апач 2.4.41 (Убунту)

Рейтинг:5
флаг in

Поместите файл .htaccess в папку мультимедиа с помощью Тип авторизации Нет.

Тип авторизации Нет
Требовать все предоставленные
Black avatar
флаг id
Работал как шарм, спасибо!
Рейтинг:1
флаг kz
# Исключить папку мультимедиа из базовой аутентификации
SetEnvIf Request_URI "^/media/*" носитель

Порядок разрешить, запретить
Требовать действительного пользователя
Разрешить из env=media
Запретить от env=!media
Удовлетворить любой

Это сработало бы, за исключением того, что регулярное выражение неверно в SetEnvIf директива, поэтому env var СМИ не устанавливается при запросе /media/someimage.jpg. Вам не хватает точки перед * квантификатор, т. ^/медиа/.*. Тем не менее, вы можете просто удалить трейлинг * вообще, т. ^/медиа/, что фактически то же самое (и более эффективное).

Запретить от env=!media директива лишняя.

Итак, должно работать следующее:

# Исключить папку мультимедиа из базовой аутентификации
SetEnvIf Request_URI "^/media/" носитель

Требовать действительного пользователя
 
Порядок разрешить, запретить
Разрешить из env=media
Удовлетворить любой

ОДНАКО это использует устаревшие директивы Apache 2.2. Вместо этого в Apache 2.4 вы можете сделать следующее:

# Исключить папку мультимедиа из базовой аутентификации
SetEnvIf Request_URI "^/media/" носитель

Требовать действительного пользователя
Требовать среды окружения

По умолчанию контейнер <RequireAny> - так что вам не нужно включать это. Хотя вы можете быть явным, если хотите:

<RequireAny>
    Require valid-user
    Require env media
</RequireAny>

В качестве альтернативы вы можете окружить весь блок авторизации в <If> выражение. Например:

# Защитите паролем все, кроме подкаталога "/media/"
<If "%{REQUEST_URI} !~ m#^/media/#">
    Основной тип авторизации
    Имя авторизации "Защищено"
    AuthUserFile "/var/www/company/.htpasswd"
    Требовать действительного пользователя
</Если>

Оператор !~ является отрицательным соответствием регулярному выражению.

Black avatar
флаг id
Круто, попробовал, все работает. Вместо этого я принимаю ваш ответ, так как он содержит больше полезных деталей и показывает, почему моя попытка не удалась.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.