很明显Django不理解它在子目录别名中运行,这完全破坏了URL的生成和解析。 我在文档中找不到任何类似前缀的设置,我的谷歌搜索也没有什么帮助......所以我在这里寻求帮助。
我唯一找到的是FORCE_SCRIPT_NAME设置,它至少修复了URL的生成。(见:http://docs.webfaction.com/software/django/config.html#mounting-a-django-application-on-a-subpath) 不幸的是,即使提到的网站建议如此,这并不能修复urlconf解析。
是否可能在子目录别名中运行Django应用程序?如果可以,该怎么做?
nginx配置:
server {
location /fancyprojectname/static {
alias /srv/fancyprojectname/static;
}
location /fancyprojectname/ {
uwsgi_pass unix://var/run/uwsgi/app/fancyprojectname/socket;
include uwsgi_params;
}
}
编辑
在 Nginx 的 location 中设置 "uwsgi_param SCRIPT_NAME /fancyprojectname;" 可以使 FORCE_SCRIPT_NAME 不必要 - 遗憾的是 URL 匹配仍然无法工作。
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
我认为正在发生的事情是:由于管理员正则表达式以 "^admin" 开头,而实际 URL 是 "fancyprojectname/admin/",Django 无法正确匹配 URL,即使 SCRIPT_NAME 已设置。
解决方案
因此,确实存在 SCRIPT_NAME 的问题。
WSGI 规范 如下所述:SCRIPT_NAME 请求 URL“路径”的初始部分,对应于应用程序对象,以便应用程序知道其虚拟“位置”。如果应用程序对应于服务器的“根”,则可能为空字符串。
PATH_INFO 请求 URL“路径”的剩余部分,指定应用程序中请求目标的虚拟“位置”。如果请求 URL 定位到应用程序根目录并且没有尾部斜杠,则可能为空字符串。
Nginx 不会自动设置 SCRIPT_NAME,因此这需要在任何情况下进行设置。然后 PATH_INFO 是错误的,因为在默认设置中,Nginx 将其设置为 $document_uri,这将是完整的 URL。
"uwsgi_modifier1 30;" 告诉 Nginx 设置 UWSGI_MODIFIER_MANAGE_PATH_INFO,这反过来告诉 UWSGI 去掉 PATH_INFO 的 SCRIPT_NAME。
这些设置的组合似乎有效,因为 Django 现在可以正确生成和匹配 URL。
FORCE_SCRIPT_NAME
示例的链接已经失效了;对于任何想知道那里写了什么的人,这里是Wayback Machine上最后保存的版本。 - Ivan Shatsky