Nginx only serves index html

Hi there,
I'm trying to run owncloud on my vserver behind nginx, as I am already using nginx for other running applications. I mainly followed this tutorial, but there seems to something wrong with my configuration, as the files are served incorrectly.


This is how it looks when I visit
(I already completed the registration step on a page, that looked just as broken as this one)

This is the tail of my php-fpm access log:

- - ***** 21/Apr/2018:11:07:01 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:01 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:01 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:01 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:01 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:01 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:02 +0200 "GET /owncloud/index.php" 302
- - ***** 21/Apr/2018:11:07:02 +0200 "GET /owncloud/index.php" 200
- - ***** 21/Apr/2018:11:07:02 +0200 "GET /owncloud/index.php" 302
- - ***** 21/Apr/2018:11:07:02 +0200 "GET /owncloud/index.php" 200



  • owncloud 10.0.7; ubuntu 16.04; nginx 1.10.3
  • instance should be reachable at
  • owncloud files are located in /var/www/owncloud/
  • www-user owns this folder and is also running php-fpm


Mostly copy+pase from
This snippet only concerns the owncloud location, and is included into my main config. Tell me if you need insight to this as well.

location ^~ /owncloud {
      # set max upload size
      client_max_body_size 512M;
      fastcgi_buffers 8 4K;                     # Please see note 1
      fastcgi_ignore_headers X-Accel-Buffering; # Please see note 2

      # Disable gzip to avoid the removal of the ETag header
      # Enabling gzip would also make your server vulnerable to BREACH
      # if no additional measures are done. See
      gzip off;

      # Uncomment if your server is build with the ngx_pagespeed module
      # This module is currently not supported.
      #pagespeed off;

      error_page 403 /owncloud/core/templates/403.php;
      error_page 404 /owncloud/core/templates/404.php;

      location /owncloud {
          rewrite ^ /owncloud/index.php$uri;

      location ~ ^/owncloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
          return 404;
      location ~ ^/owncloud/(?:\.|autotest|occ|issue|indie|db_|console) {
          return 404;

      location ~ ^/owncloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
          include fastcgi_params;
          fastcgi_split_path_info ^(.+\.php)(/.*)$;
          fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
          fastcgi_param SCRIPT_NAME $fastcgi_script_name; # necessary for owncloud to detect the context root
          fastcgi_param PATH_INFO $fastcgi_path_info;
          fastcgi_param HTTPS on;
          fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
          # EXPERIMENTAL: active the following if you need to get rid of the 'index.php' in the URLs
          #fastcgi_param front_controller_active true;
          fastcgi_read_timeout 180; # increase default timeout e.g. for long running carddav/ caldav syncs with 1000+ entries
          fastcgi_pass unix:/run/php/php7.0-fpm.sock;
          fastcgi_intercept_errors on;
          fastcgi_request_buffering off; #Available since NGINX 1.7.11

      location ~ ^/owncloud/(?:updater|ocs-provider)(?:$|/) {
          try_files $uri $uri/ =404;
          index index.php;

      # Adding the cache control header for js and css files
      # Make sure it is BELOW the PHP block
      location ~ /owncloud/.*\.(?:css|js) {
          try_files $uri /owncloud/index.php$uri$is_args$args;
          add_header Cache-Control "max-age=15778463";
          # Add headers to serve security related headers  (It is intended to have those duplicated to the ones above)
          # Before enabling Strict-Transport-Security headers please read into this topic first.
          #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
          add_header X-Content-Type-Options nosniff;
          add_header X-Frame-Options "SAMEORIGIN";
          add_header X-XSS-Protection "1; mode=block";
          add_header X-Robots-Tag none;
          add_header X-Download-Options noopen;
          add_header X-Permitted-Cross-Domain-Policies none;
          # Optional: Don't log access to assets
          access_log off;

      location ~ /owncloud/.*\.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg|map) {
          try_files $uri /owncloud/index.php$uri$is_args$args;
          add_header Cache-Control "public, max-age=7200";
          # Optional: Don't log access to other assets
          access_log off;

Thanks in advance :slight_smile:

I'd try with just the ownCloud configuration and remove / comment the rest in order to avoid any possible side effect. In addition, undo any change you did in the ownCloud configuration.
Once you get a working configuration then start changing things bit by bit and check everything keeps working.

I don't know what you mean by "just the ownCloud configuration". That would be using Apache I guess. Looking at the nginx config, everything seems pretty much essential in order for the ownCloud php scripts to do anything useful, especially the /owncloud block and the one with all the fastcgi instructions.

I think what @jvillafanez is trying to say is that there might be something before or after the posted config snippet in your main config which could cause this issue.