### Contents

1. [Introduction](#art-1)
2. [Userdir functionality like Apache's mod_userdir](#art-2)
3. [Note on how NGiNX works with HTTP headers](#art-3)
4. [Tell a Tor visitor of your clearnet site that you have an onion](#art-4)
5. [Variables](#art-5)

### 1. Introduction {#art-1}

Here I'll place recipes for implementing different functionalities and notes on webserver's behaviour.

### 2. Userdir functionality like Apache's mod_userdir {#art-2}

Once I wanted to have a &ldquo;tilde user directories&rdquo; like `/~user/` which is more known as Apache's `mod_userdir` feature. I work with NGiNX so regular expressions is the way to do that.

Nothing special in my case. I only need to keep files there, so others may get them. Thing is simple, but I took some time to realise what regexp to use here back then.

The implementation is quite simple:


    location ~ ^/~(.+?)(/.*)?$ {
        alias /home/$1/pub$2;
        autoindex on;
    }

Of course, you can choose whatever place for user's public directories. In my case you need to give a read and execute permissions to user's home directory and to public directories inside them to others (`chmod o=rX /home/user`), which may be a security concern.

`autoindex on` will make an index of files that lies by URL. And, of course, you can put there an `index.html` file.

### 3. Note on how NGiNX works with HTTP headers {#art-3}

Let's say in `http` block you specified common headers like `X-Frame-Options`, `X-XSS-Protection`, and so on for all `server` directives to use. But, if you add some other header for a specific `server` or `location` block then all those headers would be dropped.

For now the only cure for it is to place all that headers in a separate file like `common-headers.inc` and using `include` directive to include them in all the `server` and `location` blocks where additional headers are added.

### 4. Tell a Tor visitor of your clearnet site that you have an onion {#art-4}

There is a custom HTTP header `Onion-Location` that is being recognised by Tor Browser and it will show a ".onion available" button in an address bar.

The code for NGiNX is this simple:

    add_header Onion-Location http://yoursite.onion$request_uri;

### 5. Variables {#art-5}

Just wanna tell about this cool feature you can use to reduce code repetition. Alas, you can use them only in `server`, `location` and `if` blocks. If only they could be declared in a `http` block, they'd be perfect. But still, they help a lot.

I heavily use aliases pointing to directories within the same base directory.

Judging from a little testing, variables doesn't decrease performance. Or I just don't notice it.

Variables could only store strings. To demonstrate the usage I'll just post here a part of my config:

    set  $root  /srv/http/dwelling;
    ...
    location =/favicon.ico {
        alias $root/shared/static/img/favicon.ico;
    }
    ...
    location /assets/ {
        alias $root/homepage/static/assets/;
    }

The very reason why I had to use variables is that `alias` doesn't work with relative paths. I wish `alias` could be relative to `root`, but we are forced to look for workarounds.

Update: Oh, I realised that you can declare variables in `http` block using `map` directive with `default` set to value you need. Funny, I've been using `map` to prevent LAN IPs from being logged all this time, heh. So, here's example:

    map 1 $root {
        default /srv/http/dwelling;
    }