2012-08-09 47 views
0

我一直在使用的mod_python我们的Apache2生产服务器上运行的Django的web应用程序,但没有静态文件中找到(CSS,图片...)如何让Apache提供静态文件Django的

我们所有的静态的东西正在/var/my.site/example/static

/var/my.site/example/static/ 
          |-admin/ 
            |-css/ 
            |-img/  
          |-css/ 
          |-js/ 
          |-img/ 

现在,我想我只是别名,像这样所有的请求我的静态的东西:

这是apache2的CONF:

<VirtualHost 123.123.123:443> 
    ... SSL stuff ... 
    RewriteEngine On  
    ReWriteOptions Inherit 
    <Location "/example"> 
     SetHandler python-program 
     PythonHandler django.core.handlers.modpython 
     SetEnv DJANGO_SETTINGS_MODULE example.settings 
     PythonPath "[ \ 
      '/home/me/Envs/ex/lib/python2.6/site-packages',\ 
      '/var/my.site',\ 
      '/home/me/Envs/ex/lib/python2.6/site-packages/django',\ 
      '/home/me/Envs/ex/lib/python2.6/site-packages/MySQLdb',\ 
      '/var/my.site/example',\ 
      '/var/my.site/example/static'] + sys.path" 
     PythonDebug Off 

    </Location> 

    Alias /example/static /var/my.site/example/static  
    <Directory /var/my.site/example/static> 
     Order allow,deny 
     Allow from all 
    </Directory> 

</VirtualHost> 

这是我的settings.py

... 
STATIC_ROOT = '/var/my.site' 
STATIC_URL = '/example/static/' 
STATICFILES_DIRS = (
    "/var/my.site/example/static", 
) 
... 

有一个在Apache的错误日志中没有错误。但在这里记录来自Apache的secure_access.log

[09/Aug/2012:12:37:55 +0200] "GET /example/admin/ HTTP/1.1" 200 6694 
[09/Aug/2012:12:37:55 +0200] "GET /example/static/css/base.css HTTP/1.1" 301 468 
[09/Aug/2012:12:37:55 +0200] "GET /example/static/img/logo.png HTTP/1.1" 403 766 
[09/Aug/2012:12:37:55 +0200] "GET /example/static/css/base.css/ HTTP/1.1" 500 756 
[09/Aug/2012:12:37:55 +0200] "GET /example/static/admin/css/dashboard.css HTTP/1.1" 301 622 

但是,这并不工作,我不知道,如果我甚至是在正确的轨道上。它确实工作,当我设置DEBUG = True但这只是因为django服务于所有的静态文件。

我在做什么错?

有没有人知道一个很好的教程或例子?

+0

确实在/example“>之前将别名/ example/static /var/my.site/example/static 放在了一起吗? – Willian 2012-08-09 11:18:04

+0

不幸的是不是 – giZm0 2012-08-09 11:20:45

+0

你可以显示... django-stuff ...? – Willian 2012-08-09 11:23:19

回答

1

在@supervacuo暗示我从django中删除了所有东西之后,我得到了apache来为静态文件提供服务,并意识到出了什么问题。

问题是<Location "/example">优先于Alias /example/static。无论我把Alias(高于还是低于<Location> - tag)都放在哪里。

要解决它,我改变了STATIC_URLSTATIC_ROOT,不是我能改变的Alias不干预的<Location> - tag

来源:

STATIC_ROOT = '/var/my.site' 
STATIC_URL = '/example/static/' 

Alias /example/static /var/my.site/example/static 

要:

STATIC_ROOT = '/var/my.site/example' 
STATIC_URL = '/static/' 

Alias /static /var/my.site/example/static 
2

尝试逐步消除问题。

加载静态文件应该完全独立于Django。尝试在您的VirtualHost配置中注释掉与Django相关的所有行。 (请记住在更改配置后重新加载Apache)

如果可行,可能需要采取更多措施来避免Django在同一命名空间中的URL(可能使用SetHandler?)。

如果没有,您的静态文件还有一个更基本的问题。如果你不能解决它,也许ServerFault可以帮助?

+0

感谢您的建议,我把它放在正确的轨道上 – giZm0 2012-08-10 07:31:53

0

唯一的公关oblem我能看到的是这个:

"GET /example/static/css/base.css/ HTTP/1.1" 500 756

由于/base.css/是不是一个有效的链接;它传递给django;并且由于它与URL模式不匹配,所以会产生500.您应该修复具有错误/的模板。

+1

实际上,这与301上面的两条线有关;它是[Django的'APPEND_SLASH'设置](https://docs.djangoproject.com/en/1.4/ref/settings/#append-slash)踢入。 – supervacuo 2012-08-10 13:00:16