server {
   listen   80;
   server_name FQDN;
   charset utf-8;

   root PATH;
   index index.php;

   # Rewrite rule for Subsonic backend
   if ( !-d $request_filename ) {
      rewrite ^/rest/(.*).view$ /rest/index.php?action=$1 last;
      rewrite ^/rest/fake/(.+)$ /play/$1 last;
   }

   # Rewrite rule for Plex backend
   if ( !-d $request_filename ) {
      rewrite ^/plex/(.*)$ /plex/index.php?action=$1 last;
   }

   # Rewrite rule for Channels
   if (!-d $request_filename){
      rewrite ^/channel/([0-9]+)/(.*)$ /channel/index.php?channel=$1&target=$2 last;
   }

   # Beautiful URL Rewriting
   rewrite ^/play/ssid/(\w+)/type/(\w+)/oid/([0-9]+)/uid/([0-9]+)/name/(.*)$ /play/index.php?ssid=$1&type=$2&oid=$3&uid=$4&name=$5 last;
   rewrite ^/play/ssid/(\w+)/type/(\w+)/oid/([0-9]+)/uid/([0-9]+)/client/(.*)/noscrobble/([0-1])/name/(.*)$ /play/index.php?ssid=$1&type=$2&oid=$3&uid=$4&client=$5&noscrobble=$6&name=$7 last;
   location /play {
      if (!-e $request_filename) {
         rewrite ^/play/art/([^/]+)/([^/]+)/([0-9]+)/thumb([0-9]*)\.([a-z]+)$ /image.php?object_type=$2&object_id=$3&auth=$1;
         break;
      }

      rewrite ^/([^/]+)/([^/]+)(/.*)?$ /play/$3?$1=$2;
      rewrite ^/(/[^/]+|[^/]+/|/?)$ /play/index.php last;
      break;
   }

   location /rest {
      limit_except GET POST {
         deny all;
      }
   }

   location /plex {
      limit_except GET POST {
         deny all;
      }
   }

   location ^~ /bin/ {
      deny all;
      return 403;
   }

   location ^~ /config/ {
      deny all;
      return 403;
   }

   location / {
      limit_except GET POST HEAD{
         deny all;
      }
   }

   location ~ ^/.*.php {
    # PHP config...
   }

   # Rewrite rule for WebSocket
   location /ws {
    rewrite ^/ws/(.*) /$1 break;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8100/;
   }
}
