DirectoryIndex не найден в AliasMatch

Из документации у меня есть это:

AliasMatch "^/projects/(.+)" "/var/www/domain.name/$1/public"

Он должен соответствовать только таким URL, как ../projects/project1, а не ../projects/ сам по себе.

Когда я говорю http://example.org/projects/project1/, он возвращает 403 Forbidden. В журналах говорится, что из-за:

No matching DirectoryIndex found, and server-generated directory index forbidden by Options directive.

Я пытался добавить DirectoryIndex явно в vhosts, но безрезультатно. Я открыл каталог (/var/www/domain.name/project1/public), чтобы его мог прочитать каждый, и теперь он просто показывает список каталогов нужной мне папки. Я вижу, что он идет в нужную папку и вижу файл index.html, но он просто не получает его автоматически, как должен.


Обобщенная версия моего файла VirtualHost:

<VirtualHost *:443>
    DocumentRoot /var/www/domain.name/www/public
    ServerName www.domain.name

    AliasMatch "^/projects/(.+)" "/var/www/domain.name/$1/public"

    ErrorDocument 401 err.php
    ErrorDocument 404 err.php
    ErrorDocument 500 err.php

    <Directory /var/www/domain.name>
        Options Indexes FollowSymLinks
        AllowOverride All
    </Directory>
</VirtualHost>

Если я затем установлю разрешения для конкретной папки проекта на 755, я просто получу список каталогов. Я поменял обратно на 711.

Все папки в /var/www/ принадлежат пользователю username:www-data и имеют права 711.

Если я делаю прямой псевдоним для папки, т.е. Alias /projects/<actual-project-name> /var/www/domain.name/<project-name>/public, он работает.


person James    schedule 13.08.2015    source источник
comment
Почему вы упоминаете /var/www/domain.name/project1/, когда ваш псевдоним явно сопоставляется с /var/www/domain.name/project1/public?   -  person covener    schedule 14.08.2015
comment
@covener Я просто дал общее представление о том, что у меня настроено. Я обновил его, чтобы избежать путаницы. Спасибо!   -  person James    schedule 14.08.2015
comment
Соответствующий DirectoryIndex не найден — означает, что у вас нет index.html (или любого другого указанного файла индекса каталога) в этом каталоге.   -  person MrWhite    schedule 15.08.2015
comment
@w3d "...now it just shows a directory listing of the folder I want. I can see that its going to the right folder and can see the index.html file...". Все в порядке, за исключением того, что он не извлекает файл индекса, который там есть, вместо этого он просто отображает список каталогов (в котором я вижу файл индекса).   -  person James    schedule 15.08.2015
comment
И предположительно вы также включили Indexes? Ваша директива AliasMatch сопоставляет все URL-адреса, начинающиеся с /projects/<project>, с одним пунктом назначения. Это сделано намеренно? Находится ли /var/www/domain.name/<project>/public в том же корневом каталоге документа? Добавьте <VirtualHost> к своему вопросу, чтобы мы могли лучше рассмотреть.   -  person MrWhite    schedule 15.08.2015
comment
@ w3d w3d Да, вкратце, чтобы увидеть, действительно ли он указывает на правильный каталог. Я не уверен, что вы подразумеваете под одним пунктом назначения; у всех у них есть собственная папка, основанная на их имени, которое записывается в $1. domain.name/projects/<project> => /var/www/domain.name/<project>/public, тогда как domain.name/projects/ => /var/www/domain.name/www/public (по сути, просто доступ к файлу php в корне документа основного сайта - я удалил расширения .php для файлов в корне документа основного сайта). Я добавил свой VHost к вопросу.   -  person James    schedule 15.08.2015


Ответы (1)


AliasMatch "^/projects/(.+)" "/var/www/domain.name/$1/public"

Проблема в том, что все запросы сопоставляются с одним URL-адресом — каталогом. AliasMatch не копирует конечный путь в конец цели, в отличие от Alias.

Когда вы запрашиваете /projects/project1, псевдоним естественным образом сопоставляет вас с /projects/public. mod_dir (DirectorySlash) добавляет завершающую косую черту (поскольку это допустимый каталог), но индекс каталога теряется. Целевой файл — это просто /projects/public/ (каталог), как указано в директиве AliasMatch, а не /projects/public/index.html, как может показаться.

Чтобы это работало как задумано (чтобы иметь доступ ко всем файлам внутри "общедоступного" каталога, например, index.php), вам понадобится второй подшаблон в скобках, например:

AliasMatch ^/projects/([^/]+)(.*) /var/www/domain.name/$1/public/$2
person MrWhite    schedule 15.08.2015