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

Apache игнорирует .htaccess

Apache игнорирует мой .htaccess файл. Я прочитал более или менее все темы об этой проблеме, которые смог найти, и попробовал все решения, но ничего не работает. Я пробовал их не раз.

Установка

Я хочу обслуживать некоторые файлы, которые должны быть доступны только через утвержденные диапазоны IP-адресов или вход пользователя. у меня есть .htaccess файл, который я ранее использовал на веб-хосте с веб-сайтом на основе php, и теперь я хочу, чтобы он работал на VPS с веб-сайтом на основе Django.

Имена каталогов ниже были изменены, но они должны соответствовать настройке.

Расположение файлов

.htaccess файл внутри /dir в поддиректории, /dir/1/2/3.

Я хочу, чтобы он применил настройки ко всем подкаталогам в этом подкаталоге, например /dir/1/2/3/a, /dir/1/2/3/b, /dir/1/2/3/c. В этих каталогах есть файлы, доступ к которым должен быть защищен (например, /dir/1/2/3/a/file.pdfЭто должно быть сделано через .htaccess, а не общесерверные настройки, потому что список допустимых IP-адресов очень длинный, и я не хочу, чтобы он раздувал мои файлы конфигурации apache.

.htaccess файл

Большая часть контента отредактирована из соображений конфиденциальности, но она соответствует этому шаблону.

# initial deny
<Limit GET POST>
order deny,allow
deny from all

# SUBSCRIBER LIST
#a very long list that follows this pattern or with CIDR ranges
allow from 1.2.3.4

# other settings
# users
require user someuser

satisfy any
</Limit>

# authtype
AuthType Basic
AuthName "Available only for subscribers."
require valid-user
AuthUserFile "/dir/passwd"

В passwd файл также имеет необходимые разрешения.

Конфигурация Apache

Файл конфигурации по умолчанию: /etc/apache2/sites-available/000-default.conf Имеет ряд других настроек, которые работают нормально, например связанные с WSGI. Добавление бессмыслицы для проверки этого приводит к ошибке apache, как и ожидалось.

Директива о включении .htaccess:

<Directory /dir>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
</Directory>

Также пробовал:

<Directory /dir>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

Пробовал ряд других вариантов. Ни один из них не имеет значения. Я перезагружаюсь между любыми изменениями.

Я убедился, что этот каталог написан правильно.

sites-enabled vs. sites-available

Где-то я читал, что нужно отредактировать sites-enabled config, а не sites-available один. Это те же файлы, enabled один просто ссылается на sites-available один.

a2enmod

Включен:

user@server:dir$ sudo a2enmod rewrite
Module rewrite already enabled

Разрешения

chown является пользователем сервера: www-data.

chmod. Я пробовал ряд настроек: a + x, u + x, 777, многие другие, не раз.

Разрешения на момент написания:

-rwxrwxrwx  1 www-data www-data 11135 Apr  5 14:47 .htaccess

DocumentRoot

Согласно этому принятому ответу, то .htaccess файл должен быть в DocumentRoot или его субдиректор. Я изменил DocumentRoot указать на /dir. Нет эффекта.

Основные настройки apache: /etc/apache2/apache2.conf

Вместо редактирования конфигурации virtualhosts можно отредактировать основной файл настроек apache.

В этом файле есть еще Directory директивы. Один из них:

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

Я предполагаю, что любая более глубокая директива перезапишет более высокую, но я видел, как некоторые люди говорили, что это не так. Я попытался установить это на AllowOverride All также. Нет эффекта. Фактически я попытался установить для этого все директивы Directory, включая нерелевантные (относящиеся к другим каталогам, например. /var/www который не используется).

AccessFileName .htaccess

Этот параметр не изменился по сравнению с настройками по умолчанию и остался таким, каким должен.

Журналы

Ни в журнале ошибок, ни в журнале доступа нет ошибок или чего-либо существенного.

Глупый тест

Чтобы определить, читает ли apache файл, я попытался добавить преднамеренную синтаксическую ошибку в .htaccess. Ошибка сервера отсутствует, поэтому сервер должен полностью игнорировать файл.

-

Я не могу найти больше ничего, чтобы попробовать.

Я потратил больше часов на пробу идей и нашел проблему. Проблема была вовсе не в Apache, а в Django.

Чтобы выяснить это, я систематически перемещал .htaccecss файл через мою иерархию директорий. Размещение его в основном каталоге Django вызывало ожидаемую ошибку сервера (из-за преднамеренной синтаксической ошибки в файле). Перемещение его в папку с контентом не повлияло. Поэтому я решил, что Apache по какой-то причине игнорирует этот каталог. Я много раз просматривал все настройки Apache, но не мог найти ни одной причины, по которой этот каталог игнорировался. Затем у меня возникла идея, что, возможно, режим отладки сайта заставляет Django игнорировать разрешения. Отключение режима отладки Django сделало файлы недоступными (страница Django 404). Это означает, что Django теперь не может сопоставить URL-запрос с urls.py. Таким образом, я просмотрел этот файл и понял, в чем проблема.

В основном app/urls.py, Я использовал этот взлом чтобы разрешить обслуживание файлов содержимого локально во время разработки:

#to serve media files locally
from django.conf import settings
from django.conf.urls.static import static

#make it possible to serve files in debug mode locally
if settings.DEBUG:
    # static files (images, css, javascript, etc.)
    urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Таким образом, когда включен режим отладки, Django будет обслуживать файлы содержимого самостоятельно, полностью минуя настройки Apache. Таким образом, Apache не получит никаких запросов на файлы в каталоге содержимого и, следовательно, не будет проверять .htaccess файл.

Отключение режима отладки, а также некоторые другие мелкие исправления ошибок решили проблему. Надеюсь, это поможет кому-то другому.

Попробуйте бежать

chcon -R -t httpd_sys_rw_content_t /path/to/your/site

или используйте справочный каталог:

chcon -R --reference=/var/www/html /www/sites

Больше информации:

Ссылка на ссылку