Django and Nginx try_files 403 for site root page

2019-04-12 14:47发布

I use such Nginx configuration for the domain:

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 config:

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

all urls like http://domain.com/somepage.htm works good, except http://domain.com/ it always shows 403 by Nginx.

if you add static index.htm file to the site root - it's opened because of try_files directive

if you have no static index.htm, but call http://domain.com/index.htm page is opened by django

buf it you have no static index.htm and open http://domain.com/ you get no page, but by idea index.htm should be looked and passed to the django as the last in the try_files chain.

how to make http://domain.com/ work (should call django's index.htm) in this case?

2条回答
祖国的老花朵
2楼-- · 2019-04-12 15:12

A better solution is you provide a / url in your urls.py is remove the

 root /var/www/$2/htdocs;

Then only include the root in location {} blocks where you serve up static assets.

查看更多
贪生不怕死
3楼-- · 2019-04-12 15:18

Add this

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

underneath the root line to do a rewrite of the URI before further processing.

PS. You have probably sorted this out during the year since your asked, but here it is for other to see.

查看更多
登录 后发表回答