Apache .htaccess 和 .htpasswd 不会在 Django 网站中要求输入密码

Apache .htaccess 和 .htpasswd 不会在 Django 网站中要求输入密码

我有一个已配置的 Django 网站mod_wsgi,使用 Apache 2.4 作为 Web 服务器。

虚拟主机:

<VirtualHost *:80>
    ServerName site.com 
    ServerAlias site.com
    ServerAdmin [email protected]

    DocumentRoot /var/www/site

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    Alias /media/ /var/www/site/media
    Alias /static/ /var/www/site/static

    <Directory /var/www/site>
        Require all granted
        AllowOverride All
    </Directory>

    WSGIScriptAlias / /var/www/site/nep/wsgi.py

    ErrorLog /var/log/apache2/site/error.log
    CustomLog /var/log/apache2/site/access.log combined

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

</VirtualHost>

我有文件.htaccess.htpasswd/var/www/site

.htaccess内容:

AuthType Basic
AuthName "Portal Dev Environment, restricted content"
AuthUserFile /var/www/site/.htpasswd
Require valid-user

我已经搜索了该问题的所有可能的解决方案,但没有找到。

虚拟主机中是否存在配置错误,导致.htaccess其无法.htpasswd工作?

答案1

我遇到了同样的问题,并提出了这个问题。对我来说,解决方案是,Require all granted我的网站由 Django 提供支持的部分的某些指令覆盖了Require valid-user网站根目录的指令。类似:

<VirtualHost *:443>
    [...]
    
    # Other directives here
    ErrorLog ${APACHE_LOG_DIR}/error.log
    <Directory "/var/www/html">
        AuthType Basic
        AuthName "Please enter password"
        AuthUserFile /path/2/passwd/file
        Require valid-user
    </Directory>

    #for django
    Alias /app/static /var/www/html/app/static
    <Directory /var/www/html/app/static>
        Require all granted
    </Directory>

    <Directory /var/www/html/site>
       <Files wsgi.py>
            Require all granted
       </Files>
    </Directory>
    [...]
</VirtualHost>

我最初使用这些Require all granted指令来确保 Apache 可以访问 WSGI 服务器和静态文件,以便为 Django 网站提供服务。事实证明,如果您将这两个指令分别更改为Require valid-user,它就可以正常工作,然后会弹出身份验证对话框,就像在我网站上所有其他非 Django 支持的页面上一样。果然,CacoRequire all granted在其 vHost 配置中有一个指令,如上所示。

我没有使用 .htaccess 文件,我的访问控制配置仅在 vHost 配置文件中,但这不应该产生区别。

相关内容