Django和Nginx try_files 403用于站点根页面

时间:2009-09-03 21:35:34

标签: django nginx django-urls

我在域中使用了这样的Nginx配置:

server_name_in_redirect off; 
listen 80;
server_name  ~^(www\.)?(.+)$;
root /var/www/$2/htdocs;

location / {
    try_files  $uri  $uri/ $uri/index.htm  @django;
    index index.html index.htm;
}

location @django {
    fastcgi_pass 127.0.0.1:8801;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param SERVER_NAME $server_name;
    fastcgi_param SERVER_PORT $server_port;
    fastcgi_param SERVER_PROTOCOL $server_protocol;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_pass_header Authorization;
    fastcgi_intercept_errors off;
    fastcgi_param REMOTE_ADDR $remote_addr;
}

Django URL配置:

urlpatterns = patterns('',   
    url(r'^$', home, name='home'),
    url(r'index.htm', home, name='home'),    
    url(r'^(?P<name>.*).htm$', plain_page, name="plain_page"),
}

http://domain.com/somepage.htm之类的所有网址都很有效,除了http://domain.com/它总是由Nginx显示403。

如果将静态index.htm文件添加到站点根目录 - 由于try_files指令而打开它

如果您没有静态index.htm,但是django打开了http://domain.com/index.htm页面

如果你没有静态index.htm并打开http://domain.com/你没有页面,但是想法 应该查看index.htm并将其作为try_files链中的最后一个传递给django。

在这种情况下如何让http://domain.com/工作(应该调用django的index.htm)?

2 个答案:

答案 0 :(得分:4)

添加此

location = / { rewrite ^(.*)$ /index.htm last; }

在进一步处理之前,在root行下面

执行URI的重写

PS。自从你提出要求以来,你可能已经在这一年中对此进行了整理,但这里有其他人可以看到。

答案 1 :(得分:0)

更好的解决方案是在urls.py中提供/ url删除

 root /var/www/$2/htdocs;

然后只在您提供静态资产的位置{}块中包含根。