I’ve always been envious of the directory listing that Caddy has for serving files. Nginx also has the capability to list directories and files.
This is extremely useful to serve a directory out quickly over LAN or even where it is required to serve a directory listing instead of a web page.
However, the default Nginx styling leaves a lot to be desired!
The way to serve a directory out in Nginx is by the autoindex directive.
The following configuration has the autoindex directive as well as the index directive against which a random string like nothing_will_match has been set so that Nginx doesn’t show the index.html file by default.
http { server { server_name _; autoindex on; location / { root /home/abhijit/myapp; index nothing_will_match; } } }
For a directory with a Javascript application, the browser shows this.
This is seriously ugly!
To change it and make it look like the image on top of this post, a few of the other nginx directives are used.
The final Nginx configuration looks like this.
(Thanks to Nick Bettison for pointing me in the right direction.)
http { server { server_name _; autoindex on; location = '/favicon.ico' { alias /etc/nginx/theme/favicon/favicon.ico; access_log off; log_not_found off; } location /theme/ { root /etc/nginx; } autoindex on; autoindex_exact_size off; autoindex_localtime on; add_before_body "/theme/nginx-before.html"; add_after_body "/theme/nginx-after.html"; location / { root /home/abhijit/myapp; index nothing_will_match; } } }
The theme folder could be placed anywhere. I choose to keep it in my nginx folder itself. It consists of all the necessary files.
The main files in this folder are nginx-before.html and nginx-after.html.
nginx-before.html
<!DOCTYPE html> <html lang="en"> <head> <title>Directory Listing</title> <meta charset="utf-8" /> <!-- Styles --> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="/theme/css/link-icons.css"> <link rel="stylesheet" href="/theme/css/style.css"> </head> <body> <div id="title"> <span>Directory Listing</span> <span class="stats" id='file-stats'></span> <span class="stats" id='dir-stats'></span> </div> <div id='listing'> <div>
Here, I’m using the amazing Water.css for the basic styling. And the 4.7.0 version of Font-Awesome.
Beyond that, I’m also using the CSS link icons from Greg Schoppe.
nginx-after.html
</div> </div> </body> <!-- Script --> <script type="text/javascript"> var pathElement = document.querySelector('#listing h1'); pathElement.className = 'listing'; var pathName = pathElement.innerHTML; pathName = pathName.replace('Index of ', ''); pathElement.innerHTML = pathName; var fileCount = 0 ,dirCount = 0 ,dirStatElem = document.getElementById('dir-stats') ,fileStatElem = document.getElementById('file-stats') ; var allLinks = document.getElementsByTagName('a'); for (let item of allLinks){ if (item.innerHTML != "../"){ if (item.innerHTML.endsWith('/')){ dirCount += 1; } else { fileCount += 1; } } item.className = "link-icon"; } var parentFolderElement = document.querySelector("a[href='../']"); parentFolderElement.className = "folderup"; parentFolderElement.innerHTML = "⇪ Up"; if (dirCount == 1){ dirStatElem.innerHTML = dirCount + " directory"; } else { dirStatElem.innerHTML = dirCount + " directories"; } if (fileCount == 1){ fileStatElem.innerHTML = fileCount + " file"; } else { fileStatElem.innerHTML = fileCount + " files"; } </script> </html>
Here, I’m using some simple Javascript to add CSS classes and to change the folder up icon and to count the number of files and directories.
body { max-width: 90%; } #title { font-size: 1.1em; margin: 5px 0; } #title .stats { font-size: 0.8em; float: right; margin: 0 10px; } #listing { font-size: 1.1em; } #listing h1 { font-size: 1.1em; } .folderup { color: #FFCA28; font-size: 1.4em; font-weight: bold; }
Had to do some minor modifications to Greg Schoppe’s stylesheet.
/* a[href$="/"].link-icon:before, */ /* a[href$=".html"].link-icon:before, */ a[href$="/"].link-icon:before, a.link-icon.link-folder[href]:before { content: "\f07b"; /*Folder*/ } a[href$=".html"].link-icon:before, a.link-icon.link-html5[href]:before { content: "\f13b"; /*HTML5*/ }
Now Nginx looks much more presentable!
Switching to the dark theme looks pretty good as well!