如何使用Django修复Apache服务器上的403禁止访问错误?

3

当我尝试访问我的网站时,出现以下错误:

禁止访问。您没有权限访问此服务器上的 /。

我的虚拟主机文件如下所示:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


        Alias /static ~/myproject/static

        <Directory ~/myproject/static>
                Require all granted
        </Directory>

        <Directory ~/myproject/myprojectapi>
                Order allow,deny
                Require all granted
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>
</VirtualHost>

我的默认配置文件是apache2.conf。我正在使用Django 1.9和Python 2.7在Ubuntu 14.04上
我尝试了网站上大部分甚至全部的解决方案,但出于某种原因,它们都不起作用。我遵循了这个教程,并给予了以下权限: chmod 664 ~/myproject/db.sqlite3 sudo chown :www-data ~/myproject/db.sqlite3 sudo chown :www-data ~/myproject 我也是以root用户身份操作的。
如果您需要其他信息,请告诉我;我将非常乐意提供帮助。任何帮助都将不胜感激。
以下是WSGI行:
 WSGIDaemonProcess goggest python-path=~/myproject:/usr/lib/python2.7/dist-packages
        WSGIProcessGroup goggest
        WSGIScriptAlias / ~/myproject/myprojectapi/wsgi.py

@raphv /static 也无法访问,而对于(2),你是什么意思? - Jeel Shah
@RaviOjha 是的。我可以访问 ipaddress:port/route,它可以正常工作。 - Jeel Shah
@JeelShah,类似于WSGIScriptAlias / ~/myproject/wsgi.py的东西。顺便说一下,如果你在Apache配置中放置了“〜/ myproject”,它可能不会指向与命令行中相同的“〜”,因为它是用户目录的快捷方式,并且可能根据用户而变化。 - raphv
@raphv 我已经添加了相关的代码行。好的,我会将~更改为正确的目录并再试一次。编辑:我将~更改为/root/myproject..,但仍然没有任何反应。 - Jeel Shah
@raphv 是的!好的,我查看了那个文件,确实不允许在那些目录之外提供服务。我该怎么改变呢?我应该模仿/var/www/的设置吗? - Jeel Shah
显示剩余5条评论
1个回答

6
以下是我(在得到了很多帮助的情况下)解决问题的方法。 本答案假设您有以下项目结构:
~/myproject
    - myproject
      - ...
      - settings.py
      - wsgi.py
    - myapp
      - ...
      - static
        - myapp
          - ...

离题

我遇到了一个问题,我的apahce error.log 中出现了一个错误,它说找不到settings。这个问题很可能是由于您的python-path出现了错误引起的。 本部分假定您正在使用daemon方法(文档推荐)。

  1. 检查您的wsgi.py文件,确保它在os.environ.setdefault(" ... ", " ... ")中说的是myproject.settings而不是settings
  2. 检查并且再次检查您的python-path,应该像这样:WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages

这应该可以解决这个问题(至少对我来说可以)。

修复403 Forbidden(或者至少规避它)

以下是帮助我解决问题的conf内容。这不是apache2.conf,而且我apache2.conf中没有任何的内容,它仍然是默认的。以下内容位于apache2/sites-available/000-default.conf中。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        DocumentRoot /home/[username]/myproject # (1)

        Alias /static path/to/your/static_root    # (2)

        <Directory path/to/your/static_root>
                Require all granted
        </Directory>

        <Directory /home/[username]/myproject/myproject>
            Options Indexes FollowSymLinks Includes ExecCGI
            AllowOverride All
            Order allow,deny
            Allow from all
            Require all granted
        </Directory>

        <Directory /home/[username]/myproject/myproject>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages
        WSGIProcessGroup [any-name]
        WSGIScriptAlias / /home/[username]/[myproject]/[myproject]/wsgi.py

        WSGIApplicationGroup %{GLOBAL}

</VirtualHost>

RE: Points (1), (2)

(1). 将文档根目录更改为包含您Django项目文件的目录的顶部。在这种情况下,我将其更改为/home/[username]/myproject不要使用~/作为参考。我尝试过,但似乎没有成功。

(2). 如果您从同一服务器提供静态文件,请确保在settings.py文件中设置了STATIC_ROOTSTATIC_URL. 在我的情况下,我将STATIC_URL设置为/static/,将STATIC_ROOT设置为/var/www/[any-name]/static/. 当您决定部署时,您将需要运行sudo python manage.py collectstatic

还需注意的是,它应该是Alias /static而不是Alias /static/(注意斜杠后缀)。文档显示为/static/,但那是错误的,在您尝试提供静态文件时无法正常工作(Apache无法完成路径)。

就这样。所有这些步骤都将使我的服务器正常运行。如果您有任何问题,请随时评论,我会尽力帮助。祝您好运!


1
成功添加了DocumentRoot /home/[username]/myproject - Carla Urrea Stabile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接