设置

设置

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文件。

禁用调试模式以及一些其他小错误修复解决了该问题。希望这对其他人有所帮助。

相关内容