Apache 忽略了我的.htaccess
文件。我几乎读完了所有关于这个问题的帖子,也尝试了所有的解决方案,但都不起作用。我试过不止一次了。
设置
- 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
我想提供一些仅可通过批准的 IP 范围或用户登录访问的文件。我有一个.htaccess
文件,之前在基于 php 的网站的 Web 主机上使用过,现在我想让它在基于 Django 的网站的 VPS 上运行。
以下目录的名称已更改,但它们应该符合设置。
文件位置
.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
文件也具有必要的权限。
Apache 配置
默认配置文件:/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
对阵sites-available
我在某处读到过,必须编辑sites-enabled
配置文件,而不是那个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
。无效果。
主要的 Apache 设置:/etc/apache2/apache2.conf
我们不用编辑虚拟主机配置,而是可以编辑主 apache 设置文件。
此文件还有更多Directory
指令。其中之一是:
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
我假设任何更深的指令都会覆盖更高的指令,但我看到有些人说事实并非如此。我AllowOverride All
也尝试将这个设置为。没有效果。事实上,我尝试将所有目录指令都设置为该值,包括不相关的指令(例如,与其他目录相关的指令,/var/www
未使用的指令)。
AccessFileName .htaccess
此设置与默认设置相比没有变化,并且是应该的。
日志
错误日志和访问日志中都没有错误或任何相关内容。
无意义测试
为了确定 apache 是否正在读取该文件,我尝试在 中添加故意的语法错误.htaccess
。没有服务器错误,因此服务器必须完全忽略该文件。
--
我找不到其他可以尝试的东西。
答案1
尝试运行
chcon -R -t httpd_sys_rw_content_t /path/to/your/site
或使用参考目录:
chcon -R --reference=/var/www/html /www/sites
更多信息:
答案2
我花了更多时间尝试各种想法,最后找到了问题所在。问题根本不出在 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
文件。
禁用调试模式以及一些其他小错误修复解决了该问题。希望这对其他人有所帮助。