server { listen 80; server_name £{CMS_HOST}; # Prevent invalid display courseware in IE 10+ with high privacy settings add_header P3P 'CP="Open edX does not have a P3P policy."'; # Nginx does not support nested condition or or conditions so # there is an unfortunate mix of conditonals here. client_max_body_size 100M; rewrite ^(.*)/favicon.ico$ /static/images/favicon.ico last; # Disables server version feedback on pages and in headers server_tokens off; location @proxy_to_cms_app { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; proxy_redirect off; # Docker resolver resolver 127.0.0.11 valid=10s; set $upstream cms; proxy_pass http://$upstream:8000; } location / { try_files $uri @proxy_to_cms_app; } location ~ ^/static/(?P.*) { root /openedx/data/cms; try_files /staticfiles/$file /course_static/$file =404; # return a 403 for static files that shouldn't be # in the staticfiles directory location ~ ^/static/(?:.*)(?:\.xml|\.json|README.TXT) { return 403; } # Set django-pipelined files to maximum cache time location ~ "/static/(?P.*\.[0-9a-f]{12}\..*)" { expires max; # Without this try_files, files that have been run through # django-pipeline return 404s try_files /staticfiles/$collected /course_static/$collected =404; } # Set django-pipelined files for studio to maximum cache time location ~ "/static/(?P[0-9a-f]{7}/.*)" { expires max; # Without this try_files, files that have been run through # django-pipeline return 404s try_files /staticfiles/$collected /course_static/$collected =404; } # Expire other static files immediately (there should be very few / none of these) expires epoch; } }