71 lines
3.4 KiB
Markdown
71 lines
3.4 KiB
Markdown
### 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 “tilde user directories” 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;
|
|
} |