fragen stichworte

Apache ignoriert .htaccess

Apache ignoriert meine .htaccess -Datei. Ich habe mehr oder weniger jeden Thread zu diesem Problem gelesen und alle Lösungen ausprobiert und nichts funktioniert. Ich habe sie mehr als einmal ausprobiert.

Das Setup

  • Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-57-generisch x86_64) auf VPS
  • Apache/2.4.18 (Ubuntu)
  • Django 1.10 über WSGI
  • Python 3.5 in virtualenv

Ich möchte einige Dateien bereitstellen, die nur über genehmigte IP-Bereiche oder durch Benutzeranmeldung verfügbar sein sollten. Ich habe eine .htaccess -Datei, die ich zuvor auf einem Webhost mit einer PHP-basierten Website verwendet habe, und nun möchte ich, dass sie an einem VPS mit einer Django-basierten Website arbeitet.

Die Namen der folgenden Verzeichnisse wurden geändert, sollten jedoch dem Setup treu bleiben.

Speicherort der Dateien

.htaccess Datei innerhalb von /dir in einem Unterverzeichnis /dir/1/2/3.

Ich möchte, dass Einstellungen auf jedes Unterverzeichnis in diesem Unterverzeichnis angewendet werden, z. /dir/1/2/3/a, /dir/1/2/3/b, /dir/1/2/3/c. Diese Verzeichnisse enthalten Dateien, die geschützt werden sollten (z. B. /dir/1/2/3/a/file.pdf). Dies sollte über .htaccess erfolgen, nicht über serverweite Einstellungen, da die Liste der akzeptablen IPs sehr lang ist und ich meine Apache-Konfigurationsdateien lieber nicht aufgebläht habe .

.htaccess Datei

Der größte Teil des Inhalts wurde aus Datenschutzgründen geändert, er folgt jedoch dieser Vorlage.

# 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"

Die Datei passwd verfügt auch über die erforderlichen Berechtigungen.

Apache-Konfiguration

Standard-Konfigurationsdatei: /etc/apache2/sites-available/000-default.conf Hat eine Reihe anderer Einstellungen, die gut funktionieren, z. im Zusammenhang mit WSGI. Das Hinzufügen von Unsinn, um dies zu testen, führt erwartungsgemäß zu einem Apache-Fehler.

Richtlinie zur Aktivierung von .htaccess:

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

Auch versucht:

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

Es wurden einige andere Variationen getestet. Keiner von ihnen macht einen Unterschied. Ich starte zwischen den Änderungen neu.

Ich habe festgestellt, dass dieses Verzeichnis richtig geschrieben ist.

sites-enabled vs. sites-available

Irgendwo habe ich gelesen, dass man die Konfigurationsdatei sites-enabled bearbeiten muss, nicht die sites-available -Datei. Hierbei handelt es sich um dieselben Dateien, die enabled -Datei ist nur eine Verknüpfung zu der sites-available -Datei.

a2enmod

ist aktiviert:

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

Berechtigungen

chown ist der Benutzer des Servers: www-data.

chmod. Ich habe eine Reihe von Einstellungen ausprobiert: a + x, u + x, 777, viele andere mehr als einmal.

Berechtigungen gelten wie folgt:

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

DocumentRoot

Entsprechend dieser akzeptierten Antwort muss sich die .htaccess -Datei im DocumentRoot oder einem Unterverzeichnis davon befinden. Ich habe das DocumentRoot so geändert, dass es auf /dir verweist. Keine Wirkung.

Haupt-Apache-Einstellungen: /etc/apache2/apache2.conf

Anstatt die virtualhosts-Konfiguration zu bearbeiten, können Sie die Haupt-Apache-Einstellungsdatei bearbeiten.

Diese Datei enthält einige weitere Directory -Anweisungen. Eines davon ist:

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

Ich gehe davon aus, dass eine tiefere Direktive eine höhere überschreibt, aber ich habe gesehen, dass einige Leute sagen, dass dies nicht so ist. Ich habe auch versucht, diese Einstellung auf AllowOverride All zu setzen. Keine Wirkung. In der Tat habe ich versucht, alle Directory-Direktiven darauf zu setzen, einschließlich der irrelevanten (in Bezug auf andere Verzeichnisse, z. B. /var/www, die nicht verwendet werden).

AccessFileName .htaccess

Diese Einstellung ist unverändert und ist wie erwartet.

Protokolle

Im Fehlerprotokoll oder im Zugriffsprotokoll sind keine Fehler oder irgendetwas relevant.

Blödsinntest

Um festzustellen, ob Apache die Datei überhaupt liest, habe ich versucht, einen absichtlichen Syntaxfehler in .htaccess einzufügen. Kein Serverfehler, daher muss der Server die Datei vollständig ignorieren.

-

Ich kann nichts mehr zum Ausprobieren finden.

antworten

Versuchen Sie es mit

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

oder verwenden Sie das Referenzverzeichnis:

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

Weitere Informationen:

Link zur Referenz

Ich habe mehr Stunden damit verbracht, Ideen auszuprobieren, und ich habe das Problem gefunden. Das Problem war überhaupt nicht mit Apache, es war mit Django.

Um das herauszufinden, habe ich die Datei .htaccecss systematisch durch meine Verzeichnishierarchie verschoben. Die Platzierung im Haupt-Django-Verzeichnis verursachte einen Serverfehler wie erwartet (aufgrund des absichtlichen Syntaxfehlers in der Datei). Das Verschieben in mein Inhaltsverzeichnis hatte keine Auswirkungen. Also argumentiere ich, dass Apache dieses Verzeichnis aus irgendeinem Grund ignorieren muss. Ich habe die Apache-Einstellungen viele Male durchgesehen, konnte aber keinen Grund finden, warum dieses Verzeichnis ignoriert wurde. Dann hatte ich die Idee, dass der Debug-Modus der Seite Django vielleicht dazu brachte, die Berechtigungen zu ignorieren. Das Deaktivieren des Django-Debug-Modus machte den Zugriff auf die Dateien unmöglich (Django 404-Seite). Dies bedeutet, dass Django die URL-Anfrage nun nicht mehr an urls.py anpassen konnte. Also habe ich in diese Datei geschaut und das Problem erkannt.

In der Hauptsache app/urls.py hatte ich diesen Hack-Around verwendet, um die Bereitstellung von Inhaltsdateien während der Entwicklung lokal zu ermöglichen:

#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)

Wenn also der Debug-Modus aktiviert ist, würde Django die Inhaltsdateien selbst bereitstellen und die Apache-Einstellungen vollständig umgehen. Daher würde Apache keine Anforderung für Dateien im Inhaltsverzeichnis empfangen und würde daher die .htaccess -Datei nicht prüfen.

Durch das Deaktivieren des Debug-Modus und einige kleinere Fehlerbehebungen wurde das Problem behoben. Hoffe das hilft jemand anderem.