Apache忽略.htaccess

Apache忽略我的.htaccess文件。 我已经读了或多或less关于这个问题的每一个线索,我可以find并尝试所有的解决scheme,没有任何工作。 我已经尝试过不止一次。

设置

  • VPS上的Ubuntu 16.04.1 LTS(GNU / Linux 4.4.0-57-generic x86_64)
  • Apache / 2.4.18(Ubuntu)
  • Django 1.10通过WSGI
  • Python 3.5在virtualenv

我想提供一些文件,只能通过批准的IP范围或用户login。 我有一个.htaccess文件,我以前曾经在一个基于php的网站的虚拟主机上使用,现在我想让它在一个基于Django的网站上使用VPS。

以下目录的名称已被更改,但应忠实于设置。

文件的位置

.htaccess文件里面的/dir在一个子目录中, /dir/1/2/3 1/2/3。

我希望它将设置应用于该子目录中的每个子目录,例如/dir/1/2/3/a 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列表非常长,我宁愿没有它膨胀我的Apacheconfiguration文件。

.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文件也具有必要的权限。

Apacheconfiguration

默认configuration文件: /etc/apache2/sites-available/000-default.conf有一些其他的设置工作正常,例如与WSGI有关。 添加废话testing这将导致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> 

尝试了一些其他的变化。 他们没有任何区别。 我在任何更改之间重新启动

我已validation此目录拼写正确。

sites-enabledsites-available

我读过的一个地方是,必须编辑sites-enabledconfiguration文件,而不是sites-availableconfiguration文件。 这些是相同的文件, 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

可以编辑主要的apache设置文件,而不是编辑虚拟主机configuration。

这个文件有更多的Directory指令。 其中之一是:

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

我认为任何更深的指令都会覆盖更高的指令,但我看到一些人说这不是。 我试着把这个设置为AllowOverride All 。 没有效果。 实际上,我尝试设置所有的目录指令,包括不相关的目录(有关其他目录例如/var/www这是不使用)。

AccessFileName .htaccess

这个设置与默认值没有变化,因为它应该是。

日志

错误日志或访问日志中没有错误或任何相关性。

废话testing

为了确定apache是​​否甚至读取文件,我尝试在.htaccess添加故意的语法错误。 没有服务器错误,所以服务器必须完全忽略文件。

我找不到任何更多的尝试。

尝试运行

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

或使用参考目录:

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

更多信息:

链接到参考

我花了更多的时间尝试想法,我发现了这个问题。 问题不在于Apache,而在于Django。

为了find.htaccecss ,我系统地将.htaccecss文件移到了我的目录层次结构中。 将它放在主Django目录中,如预期的那样导致服务器错误(由于文件中的故意语法错误)。 将其移入我的内容目录没有任何影响。 所以我推理Apache由于某种原因必须忽略这个目录。 我多次查看所有的Apache设置,但找不到任何理由为什么这个目录被忽略。 然后我有这样的想法,也许该网站的debugging模式导致Django忽略权限。 禁用Django的debugging模式使文件无法访问(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) 

因此,当打开debugging模式时,Django会自己提供内容文件,完全绕过Apache设置。 因此,Apache不会收到任何内容目录中的文件请求,因此不会检查.htaccess文件。

禁用debugging模式,以及一些其他小错误修复,解决了这个问题。 希望这可以帮助别人。