在不更改Apache配置的情况下,用Apache和mod_wsgi提供静态文件?

1 投票
2 回答
2590 浏览
提问于 2025-04-16 05:48

我有一个Django应用程序,正在使用共享服务器托管,所以我不能更改apache的配置文件。我能做的只有修改我应用程序里的.htaccess文件。我还有一个标准的django.wsgi Python文件,作为入口点。

在开发环境中,我是用Django来提供静态文件的,但官方文档不建议这样做,建议应该通过网络服务器来处理这些文件。

有没有办法在不访问Apache配置的情况下,仅通过修改.htaccess或django.wsgi文件来让Apache提供静态文件呢?

2 个回答

1

从一个不同的虚拟主机上提供静态文件。

2

第一步是只需在你的 .htaccess 文件中添加

AddHandler wsgi-script .wsgi

这行代码,别的什么都不用加,这样就能把 wsgi 设置为处理程序。这样,所有请求到 django.wsgi 和 django.wsgi/后面跟的内容都会转到你的 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 来处理。

接下来,你需要把 django.wsgi 从生成的 URL 中隐藏。这可以通过在你的 django.wsgi 文件中添加类似下面的代码来实现

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。我大部分的细节都是从那里来的,只是把正确的部分整理成了一个步骤。

撰写回答