【问题标题】:Serving static files with apache and mod_wsgi without changing apache's configuration?使用 apache 和 mod_wsgi 提供静态文件而不更改 apache 的配置?
【发布时间】:2011-04-28 05:34:30
【问题描述】:

我有一个 Django 应用程序,并且我使用的是共享服务器托管,所以我无法更改 apache 的配置文件。我唯一可以更改的是我的应用程序中的 .htaccess 文件。我还有一个标准的 django.wsgi python 文件,作为入口点。

在开发环境中,我使用 Django 来提供静态文件,但在官方文档中不鼓励这样做,说您应该使用 Web 服务器来代替。

有没有办法通过 apache 提供静态文件,而无需访问 Apache 的配置,只更改 .htaccess 或 django.wsgi 文件??

【问题讨论】:

标签: python django apache .htaccess mod-wsgi


【解决方案1】:

第一步是添加刚刚

AddHandler wsgi-script .wsgi

到您的 .htaccess 文件中,无需将 wsgi 建立为处理程序。这将对 django.wsgi 和 django.wsgi/whatever 的请求发送到您的 django 应用程序。

要使 URL 的 django.wsgi 部分消失,您需要使用 mod_rewrite。希望您的主机启用它。一个例子是

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L]

如果 URL 匹配文件,它将提供文件,如果不匹配,则由 django 提供。另一种选择是

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^/?static/
RewriteRule ^(.*)$ /django.wsgi/$1 [QSA,PT,L]

要对 /static/* 发出请求,请转到文件本身,其他所有内容都通过 django 进行。

然后您需要从生成的 URL 中隐藏 django.wsgi。这可以通过 django.wsgi 中的 sn-p 来完成

def _application(environ, start_response):
    # The original application.
    ...

import posixpath

def application(environ, start_response):
    # Wrapper to set SCRIPT_NAME to actual mount point.
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
    return _application(environ, start_response)

如果这不完全正确,请务必咨询http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines。我从那里提取了答案的大部分细节,但只是逐步将正确的部分放在一起。

【讨论】:

    【解决方案2】:

    提供来自不同虚拟主机的静态文件。

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多