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
файл также имеет необходимые разрешения.
Файл конфигурации по умолчанию: /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
. Нет эффекта.
/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
Больше информации: