Apache ignorando .htaccess

1

O Apache ignora meu arquivo .htaccess . Eu li mais ou menos todos os tópicos sobre este problema que eu poderia encontrar e tentei todas as soluções e nada funciona. Eu tentei mais de uma vez.

A configuração

  • Ubuntu 16.04.1 LTS (GNU / Linux 4.4.0-57-genérico x86_64) no VPS
  • Apache / 2.4.18 (Ubuntu)
  • Django 1.10 via WSGI
  • Python 3.5 no virtualenv

Desejo exibir alguns arquivos que devem estar disponíveis somente por meio de intervalos de IP aprovados ou login de usuário. Eu tenho um arquivo .htaccess que eu usei anteriormente em um webhost com um site baseado em php, e agora eu quero que ele funcione em um VPS com um site baseado em Django.

Os nomes dos diretórios abaixo foram alterados, mas eles devem ser fiéis à configuração.

Localização dos arquivos

.htaccess arquivo dentro de /dir em um subdiretório, /dir/1/2/3 .

Eu quero aplicar configurações a todos os subdiretórios desse subdiretório, por exemplo, /dir/1/2/3/a , /dir/1/2/3/b , /dir/1/2/3/c . Esses diretórios têm arquivos que devem ser protegidos (por exemplo, /dir/1/2/3/a/file.pdf ). Isso deve ser feito via .htaccess , não configurações do servidor porque a lista de IPs aceitáveis é muito longa e eu prefiro não inchar meus arquivos de configuração do apache .

.htaccess file

A maior parte do conteúdo é redigida por motivos de privacidade, mas segue este modelo.

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

O arquivo passwd tem as permissões necessárias também.

Configuração do Apache

Arquivo de configuração padrão: /etc/apache2/sites-available/000-default.conf Tem várias outras configurações que funcionam bem, por ex. relacionado ao WSGI. Adicionar um disparate para testar isso resulta em erro de apache conforme o esperado.

Diretiva para ativar .htaccess :

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

Também tentei:

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

Tentei várias outras variações. Nenhum deles faz diferença. Eu reinicio entre as alterações.

Eu verifiquei que este diretório está escrito corretamente.

sites-enabled vs. sites-available

Em algum lugar, eu li que é preciso editar o arquivo sites-enabled config, não o sites-available one. Estes são os mesmos arquivos, o enabled one apenas vincula ao sites-available one.

a2enmod

está ativado:

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

Permissões

chown é o usuário do servidor: www-data .

chmod . Eu tentei várias configurações: a + x, u + x, 777, muitas outras, mais de uma vez.

As permissões são as seguintes:

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

DocumentRoot

De acordo com essa resposta aceita , o arquivo .htaccess deve ser no DocumentRoot ou um subdir desse. Eu mudei o DocumentRoot para apontar para /dir . Sem efeito.

Configurações principais do apache: /etc/apache2/apache2.conf

Em vez de editar a configuração do virtualhosts, pode-se editar o arquivo principal de configurações do apache.

Este arquivo tem mais algumas diretivas Directory . Uma delas é:

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

Eu assumo que qualquer diretiva mais profunda irá sobrescrever uma mais alta, mas eu vi algumas pessoas dizendo que não é assim. Eu tentei definir este como AllowOverride All também. Sem efeito. Na verdade, tentei configurar todas as diretivas do Diretório para isso, incluindo as irrelevantes (relacionadas a outros diretórios, por exemplo, /var/www , que não é usado).

AccessFileName .htaccess

Esta configuração não é alterada do padrão e é como deveria.

Registros

Não há erros nem nada de relevância no log de erros ou no log de acesso.

Teste sem sentido

Para determinar se o apache está lendo o arquivo, tentei adicionar um erro de sintaxe deliberado em .htaccess . Nenhum erro do servidor, portanto, o servidor deve estar ignorando o arquivo completamente.

-

Não consigo encontrar mais nada para tentar.

    
por Deleet 05.04.2017 / 18:34

2 respostas

0

Passei mais horas tentando ideias e descobri o problema. O problema não foi com o Apache, foi com o Django.

Para descobrir, movi sistematicamente o arquivo .htaccecss para a hierarquia dir. Colocá-lo no diretório principal do Django causou um erro no servidor conforme esperado (devido ao erro de sintaxe deliberado no arquivo). Movê-lo para o meu diretório não teve efeito. Então eu raciocinando que o Apache deve estar ignorando este diretório por algum motivo. Eu examinei todas as configurações do Apache muitas vezes, mas não encontrei nenhuma razão para que esse diretório fosse ignorado. Então eu tive a idéia de que talvez o modo de depuração do site estivesse fazendo com que o Django ignorasse as permissões. Desabilitar o modo de depuração do Django tornou os arquivos inacessíveis (página do Django 404). Isso significa que o Django agora não conseguiu corresponder a solicitação de URL ao urls.py . Assim, eu olhei neste arquivo e percebi o problema.

No principal app/urls.py , eu usei esse truque para ativar veiculação de arquivos de conteúdo localmente durante o desenvolvimento:

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

Assim, quando o modo de depuração está ativado, o Django serviria os próprios arquivos de conteúdo, ignorando completamente as configurações do Apache. Assim, o Apache não receberia nenhum pedido de arquivos no diretório de conteúdo e, portanto, não verificaria o arquivo .htaccess .

Desativar o modo de depuração, juntamente com algumas outras pequenas correções de erros, resolveu o problema. Espero que isso ajude alguém.

    
por 06.04.2017 / 07:26
0

Tente executar

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

ou use o diretório de referência:

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

Mais informações:

Link para referência

    
por 05.04.2017 / 19:00