Я пытаюсь включить распечатку каталога для папки вне корневого веб-узла с другого локального монтирования ext4, использующего обычную аутентификацию, но получаю пустой список и никаких зарегистрированных ошибок. Странно то, что, если я помещаю в браузер известное местоположение файла в этом каталоге, он просто скачивает файл.
Вот мой файл example.conf
:
<virtualhost *:80>
ServerAdmin donotreply@blah.com
ServerName example.com
ServerAlias www.example.com
DirectoryIndex index.php
DocumentRoot /var/www/example.com
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
LogLevel warn
ErrorLog /var/apachelogs/error.log
CustomLog /var/apachelogs/access.log combined
Alias /blah2 "/blah1/blah2"
<Location /blah2>
Options +Indexes +MultiViews +FollowSymLinks
IndexOptions +FancyIndexing
</Location>
</virtualhost>
А вот мой .htaccess
AuthType Basic
AuthName "Authentication Required"
AuthUserFile "/home/myusername/.htpasswd"
Require valid-user
Кроме того, я прокомментировал IndexIgnore
в /etc/apache2/mods-enabled/autoindex.conf
#IndexIgnore .??* *~ *# RCS CVS *,v *,t
Я запускал chmod -R 755 /blah1/blah2
, а также chgrp -R www-data /blah1/blah2
и chmod a+x -R /blah1/blah2
. Владелец папки является членом www-data. Если я запускаю sudo usermod -a -G www-data myusername
, я могу нормально просматривать и читать все файлы и папки.
При некотором тестировании моя конфигурация работает нормально, если я перемещаю / blah1 / blah2 в свой домашний каталог и меняю псевдоним. Есть что-то в том, что он находится на другом монтировании, что портит mod_autoindex, хотя apache может четко читать сами файлы. Удаление аутентификации не помогает. С LogLevel warn
я не получаю зарегистрированных ошибок. После изменения моего LogLevel на trace4, вот мой журнал ошибок .
Вот строка монтирования из /etc/fstab
:
UUID=[theuuid] /blah1 ext4 rw,nosuid,nodev,errors=remount-ro 0 0
РЕДАКТИРОВАТЬ Последнее примечание: подтверждая, что www-данные могут читать и записывать в мою папку, я сделал следующий скрипт php :
<?php
mkdir ("testdir");
var_dump(scandir('.'));
?>
Результат: каталог testdir создается с владельцем www-data: www-data, а список каталогов и файлов выводится как переменная.
Apache должен будет выполнить права для всех каталогов, Вашего случая /blah1
и /blah2
. Если это встречается с каталогом, это не сделало, чтобы группа выполнила права для каталога, это не сделает списка.
Вероятно, необходимо изменить /blah1
или сделать, чтобы общественность выполнила права или показанный www-data
чтобы быть это - группа с правом казни группы, например. g+x
Существует несколько вещей, которые могли быть изменены в Вашей конфигурации. Для помощи Вам я предоставляю здесь следующее руководство, на основе конфигурации Apache2 по умолчанию.
Для доступа к файлам, пользователю Apache www-data
потребности прочитать полномочия в файлы и читать - выполняют полномочия к каталогам, также в этом чтении числа - выполняют полномочия к целому пути. Если бы у Вас нет особых требований, я предложил бы, чтобы Вы использовали другие пользовательские полномочия.
Давайте примем каталог, который Вы хотите индексировать через веб-сервер, назван bar
и это расположено в корневом каталоге пользователя foo
. По умолчанию он каталоги /home
и /home/foo
должен иметь 755
полномочия. Последний бит в восьмеричном числе 755
средства, которые все другие пользователи считали - выполняют полномочия (доступ рада содержания) в файлы внутри /home/foo
.
Поэтому давайте создадим наш каталог /home/foo/bar
и давайте гарантируем, что это (и его путь) имеет r-x
полномочия для других пользователей:
mkdir -p /home/foo/bar # create the directory
find /home/foo/bar -type d -exec chmod o+rx {} + # apply o+rx for the dirs recursively
sudo chmod o+rx /home /home/foo # this step is optional
Теперь давайте создадим три тестовых файла и гарантируем, что они прочитали полномочия для других пользователей:
touch /home/foo/bar/file.{1..3} # create three empty test files
find /home/foo/bar -type f -exec chmod o+r {} + # apply o+r for the files recursively
Для разрешения www-data
записать содержание в /home/foo/bar
можно изменить владение группы каталога и добавить rwxs
полномочия группы (больше деталей):
find /home/foo/bar -type d -exec chgrp www-data {} +
find /home/foo/bar -type d -exec chmod g+rwxs {} +
Тест путем создания еще трех пустых файлов:
sudo -u www-data touch /home/foo/bar/file.{4..6}
По умолчанию, в основном конфигурационном файле /etc/apache2/apache2.conf
, из соображений безопасности, доступа к корневому каталогу /
ограничивается. Я предложил бы, чтобы Вы не сделали переопределения эти правила с помощью виртуальной конфигурации хоста и удалили <Directory />
теги (и прилагаемые директивы).
В частности, если Вы создаете Псевдоним к каталогу за пределами Вашего DocumentRoot
, Вы, возможно, должны явно разрешить доступ к целевому каталогу (исходный Модуль Apache mod_alias).
Давайте сначала создадим .htpasswd
файл с достаточным количеством полномочий (добавляют больше безопасности при помощи 2FA - p.6):
htpasswd -c /home/foo/.htpasswd foo # authentication for the username 'foo'
chmod 400 /home/foo/.htpasswd # restricted the permissions
sudo chown www-data:www-data /home/foo/.htpasswd # change the ownership
Согласно вышеупомянутому, соответствующей части Вас виртуальный конфигурационный файл хоста должен быть чем-то вроде этого:
<VirtualHost *:80>
# Other configuration directives
Alias "/bar" "/home/foo/bar"
<Directory "/home/foo/bar">
#Require all granted
Options +Indexes +MultiViews +FollowSymLinks
IndexOptions +FancyIndexing
# Allow using of a .htaccess files
AllowOverride All
# This section could be moved in .htaccess file
<IfModule mod_authz_core.c>
<IfModule mod_authn_file.c>
AuthType Basic
AuthName "Type some hints here..."
AuthUserFile /home/foo/.htpasswd
</IfModule>
Require valid-user
</IfModule>
</Directory>
</VirtualHost>
Включите соответствующие модули и перезапустите Apache2 для применения новой конфигурации:
sudo a2enmod authz_core authz_user authn_file
sudo systemctl restart apache2.service
Я предполагаю, что проблема принадлежит проблеме полномочий файловой системы. Вероятно, самый самый легкий путь, для решения его, состоит в том, чтобы смонтировать целевой каталог в каталоге DocumentRoot при помощи bindfs
поскольку это описано в этом ответе.
Вот конечное решение: откажитесь от идеи заставить Псевдоним работать правильно на мою внешне смонтированную папку и вместо этого слушать совет и использование обходного решения @pa4080bindfs
смонтировать папку к/blah2 в webroot. Я был неудачен в получении/etc/fsab для корректной инициализации моего связывать, таким образом, я решил записать init сценарий для задачи.
Во-первых, установка bindfs:
apt-get update
apt-get install bindfs
mkdir /var/www/example.com/blah2
Затем я создал файл сценария /var/www/scripts/blahbind.sh
быть выполненным на запуске:
#!/bin/bash
bindfs -o force-user=www-data,perms=a=rX /blah1/blah2 /var/www/example.com/blah2
Затем дайте ему корректные полномочия:
chmod 750 /var/www/scripts/blahbind.sh
chmod +x /var/www/scripts/blahbind.sh
Затем я создал сервисный сценарий:
vi /etc/systemd/system/blahbind.service
С содержанием:
[Unit]
Requires=mydrive.mount
After=mydrive.mount
Description=bind /blah1/blah2 to example.com/blah2 folder
[Service]
ExecStart=/var/www/scripts/blahbind.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Примечание, mydrive.mount
должен быть заменен диском /blah1/blah2
папка. Получите список монтирования с systemctl list-units --type=mount
.
Подтвердите, что сервисный сценарий работает путем выполнения
sudo service blahbind start
Затем позвольте сервису сохраниться на перезагрузке с:
sudo systemctl enable blahbind.service
И затем, мой упрощенный блок Местоположения, без Alias
в example.com.conf
<Location /blah2>
Options +Indexes +MultiViews +FollowSymLinks
IndexOptions +FancyIndexing
</Location>
На основе
example.conf
, Вы имеете/var/www/example.com
как корень документа и/blah1/blah2
как смонтированный Каталог ext4.
Позвольте нам, принял Корень Документа Symlinked к Вашему смонтированному Каталогу. теперь мы должны подтвердить местоположение нашего Корня Документа. мы скопируем использование файлов rsync
. это выведет содержание в точку монтирования вместо того, чтобы передать его в содержание html
местоположение.
$sudo rsync -av /var/www/example.com/html /blah1/blah2
Теперь мы готовы обновить конфигурацию
<VirtualHost *:80>
...
...
DocumentRoot /var/www/example.com
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
...
...
Alias /blah2 "/blah1/blah2"
<Directory "/blah1/blah2">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
IndexOptions FancyIndexing
Require valid-user
...
...
#to ensure the DocumentRoot is updated in rewrites or aliases to reflect the changes at the new location.
RewriteEngineon
RewriteCond %{HTTP_HOST} =www.example.com
RewriteRule ^index\.html$ filename.html
...
</Directory>
<VirtualHost>
Не забывайте включать mod_rewrite
посмотрите это документы.
Наконец мы проверяем синтаксис и Перезапуск Ваш Apache.
$sudo apachectl configtest
$sudo systemctl reload apache
Надеюсь это услужливо.