Назад | Перейти на главную страницу

Автоиндекс обрезает конец пути к каталогу; необходимо обходное решение

Я пытаюсь создать своего рода общий хостинг с nginx, где у каждого пользователя есть public_html каталог. Запросы к /~username имеют псевдоним /home/domain-users/username/public_html. Проблема в том, что я также хочу, чтобы автоиндексирование было включено. С приведенной ниже конфигурацией, добавленной в блок сервера, запросы к определенным файлам, например /~username/test.txt работают нормально; они связаны с /home/domain-users/username/public_html/test.txt. Однако при попытке запросить /~username или ~/username/, Я получаю 404 и /var/log/nginx/error.log показывает, что автоиндекс по какой-то причине пытается перечислить файлы в /home/domain-users/username/public_htm (обратите внимание на отсутствующую букву "l": путь усечен.)

Поскольку возможность получить доступ /~username без косой черты в конце, поскольку каталог не важен, я попытался удалить $public_html_path/ из try_files директива. Тогда даже при запросе /~username/, автоиндекс не вызывается. Возможно, в try_files для работы автоиндекса.

# For requests to "/~username" without a trailing slash
set $public_html_path "";
# Lazy quantifier at the end allows processing requests to "~/username". We add the trailing slash later in try_files
location ~ ^\/\~(?<user_home_folder>[^\\n\/]+)(?<public_html_path>\/.*)?$ {
    alias /home/domain-users/$user_home_folder/public_html;
    autoindex on;
    try_files $public_html_path $public_html_path/ =404;
}

Мои исследования дали скудные результаты, самое близкое из них - этот вопрос StackOverflow. Поскольку это, похоже, ошибка в NGINX, которую вряд ли можно исправить (последний комментарий был более года назад), я ищу обходной путь. Используя root директива вместо alias было бы идеально, за исключением того, что автоиндекс удаляет критические /~username/ часть URI, полагая, что файлы, которые он перечисляет, находятся в корневом веб-каталоге, поскольку в некотором смысле они есть. Мы будем очень благодарны даже за хитрые обходные пути ... Спасибо!

Когда используешь alias с регулярным выражением location, вам необходимо восстановить полное имя пути в alias стоимость. Видеть этот документ для подробностей.

location ~ ^/~(?<user_home_folder>[^/]+)(?<public_html_path>/.*)?$ {
    alias /home/domain-users/$user_home_folder/public_html$public_html_path;
    autoindex on;
}

С помощью try_files и alias вместе могут вызвать осложнения из-за Эта проблема. Но поведение по умолчанию практически идентично try_files заявление в вашем вопросе.