У меня есть веб-сайт, на который никто не может войти, не введя базовые учетные данные для аутентификации.
Однако мне нужно, чтобы медиа-папка была доступна всем, потому что мы используем стороннее расширение, которое создает PDF-файлы, и мы можем полностью протестировать их только в том случае, если медиа-файл доступен.
Медиа-папка находится по адресу /var/www/company/pub/media
.
Домен(www.example.com)указывает на /var/www/company/pub
, поэтому папка pub является точкой входа.
Это моя попытка.htaccess.(/var/www/company/.htaccess
):
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/pub/
RewriteCond %{REQUEST_URI} !^/setup/
RewriteCond %{REQUEST_URI} !^/update/
RewriteCond %{REQUEST_URI} !^/dev/
RewriteRule.* /pub/$0 [L]
DirectoryIndex index.php
AuthType Basic
AuthName "Protected"
AuthUserFile "/var/www/company/.htpasswd"
# Exclude media folder from basic auth
SetEnvIf Request_URI "^/media/*" media
Order allow,deny
Require valid-user
Allow from env=media
Deny from env=!media
Satisfy any
Но если я попытаюсь вызвать http://www.example.com/media/someimage.jpg, я все равно получу приглашение для входа в систему.
Среда:
Apache 2.4.41 (Ubuntu)
# Exclude media folder from basic auth SetEnvIf Request_URI "^/media/*" media Order allow,deny Require valid-user Allow from env=media Deny from env=!media Satisfy any
Это сработало бы, за исключением того, что регулярное выражение в директиве SetEnvIf
неверно, поэтому env var media
не устанавливается при запросе /media/someimage.jpg
. Вам не хватает точки перед квантификатором *
, т.е. ^/media/.*
. Однако вы можете просто удалить завершающий *
вообще, т.е. ^/media/
, который фактически такой же (и более эффективный).
Директива Deny from env=!media
является лишней.
Итак, следующее должно работать:
# Exclude media folder from basic auth
SetEnvIf Request_URI "^/media/" media
Require valid-user
Order allow,deny
Allow from env=media
Satisfy Any
ОДНАКО, здесь используются устаревшие директивы Apache 2.2. В Apache 2.4 вместо этого вы можете сделать следующее:
# Exclude media folder from basic auth
SetEnvIf Request_URI "^/media/" media
Require valid-user
Require env media
Контейнер по умолчанию — это <RequireAny>
-, поэтому вам не нужно включать это. Хотя вы можете указать явно, если хотите,:
<RequireAny>
Require valid-user
Require env media
</RequireAny>
В качестве альтернативы, вы можете окружить весь блок авторизации выражением <If>
. Например,:
# Password protect everything except the "/media/" subdirectory
<If "%{REQUEST_URI} !~ m#^/media/#">
AuthType Basic
AuthName "Protected"
AuthUserFile "/var/www/company/.htpasswd"
Require valid-user
</If>
Оператор !~
представляет собой инвертированное совпадение с регулярным выражением.
Поместите файл .htaccess в папку мультимедиа с AuthType None
.
AuthType None
Require all granted