Concrete stores files in the so-called “Storage Locations”.
By default, Concrete installs one storage location, which is a publicly accessible folder published under application/files.
Under that directory, the files are stored in subfolders which represent “internal identifiers” of the file.
Files in that directory can be directly seen via the we browser, without passing through any Concrete permission control.
For example, you may access a file with
https://my-site.com/application/files/8517/7625/6130/test.jpg
This is the “Direct URL”.
In order to have Concrete check for permissions, you have to use the “Tracking URL”, which may be something like
https://my-site.com/download_file/da83feac-05d4-40e0-b840-2f7c02c94d8e/9
But using the default storage location, the URL under application/files is still accessible by anyone.
If you want to protect some files, you can creare a second storage location, with files stored outside the web root.
In that case, there will be no “Direct URL” that users can use to get the file without passing through Concrete permission controls.
For example, if the root of your website is located in the directory:
/var/www/my-site
you can create a directory outside it, for example:
/var/www/my-site-protected-files
Then you can go to the ConcreteCMS Dashboard > System & Settings > Files > File Storage Locations and create a new storage location:
Then you can create a Concrete “folder”, setting its storage location to the storage location you just created:
When you add files to that new folder, you’ll see that the “Direct URL” and the “Tracking URL” are the same (that’s because there’s no URL that points directly to the file without passing though Concrete).