Apache忽略我的.htaccess文件。 我已经读了或多或less关于这个问题的每一个线索,我可以find并尝试所有的解决scheme,没有任何工作。 我已经尝试过不止一次。
我想提供一些文件,只能通过批准的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文件也具有必要的权限。
默认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-enabled与sites-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 。 没有效果。
/etc/apache2/apache2.conf 可以编辑主要的apache设置文件,而不是编辑虚拟主机configuration。
这个文件有更多的Directory指令。 其中之一是:
<Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory>
我认为任何更深的指令都会覆盖更高的指令,但我看到一些人说这不是。 我试着把这个设置为AllowOverride All 。 没有效果。 实际上,我尝试设置所有的目录指令,包括不相关的目录(有关其他目录例如/var/www这是不使用)。
AccessFileName .htaccess 这个设置与默认值没有变化,因为它应该是。
错误日志或访问日志中没有错误或任何相关性。
为了确定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模式,以及一些其他小错误修复,解决了这个问题。 希望这可以帮助别人。