apache не будет индексировать папку с другого монтирования

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

enter image description here

Вот мой файл 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, а список каталогов и файлов выводится как переменная.

7
задан 28 August 2019 в 22:20

3 ответа

Apache должен будет выполнить права для всех каталогов, Вашего случая /blah1 и /blah2. Если это встречается с каталогом, это не сделало, чтобы группа выполнила права для каталога, это не сделает списка.

Вероятно, необходимо изменить /blah1 или сделать, чтобы общественность выполнила права или показанный www-data чтобы быть это - группа с правом казни группы, например. g+x

0
ответ дан 23 November 2019 в 06:55

Существует несколько вещей, которые могли быть изменены в Вашей конфигурации. Для помощи Вам я предоставляю здесь следующее руководство, на основе конфигурации 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}


Соглашение с конфигурацией Apache

По умолчанию, в основном конфигурационном файле /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


Демонстрационный результат

enter image description here


Обновление:

Я предполагаю, что проблема принадлежит проблеме полномочий файловой системы. Вероятно, самый самый легкий путь, для решения его, состоит в том, чтобы смонтировать целевой каталог в каталоге 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>
1
ответ дан 23 November 2019 в 06:55

На основе 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

Надеюсь это услужливо.

0
ответ дан 23 November 2019 в 06:55

Другие вопросы по тегам:

Похожие вопросы: