My previous attempt is pretty much a fail. It works but it shouldn’t be done that way.
Here be updated version to imitate mod_userdir functionality in nginx – pointing /~username to correct path. Complete with php(-cgi) handler.
upstream php-cgi {
server 127.0.0.1:9000;
}
server {
listen 80;
server mahleetserver.com;
index index.php;
client_max_body_size 3m;
if ($uri ~ ^/~edho/blog) {
set $err404 /~edho/blog/index.php;
set $is_custom404 1;
}
if ($is_custom404 != 1) {
set $err404 /404.html;
}
error_page 404 $err404;
#username should only contain these letters, right?
location ~ /~([A-Za-zd-_s]+)(.*)$ {
alias /export/home/$1/public_html$2;
location ~ .php {
if ($fastcgi_script_name ~ /~([A-Za-zd-_s]+)(.*)$ {
set $ud_name $1; set $ud_uri $2;
}
root /export/home/$ud_name/public_html;
try_files $ud_uri @404;
fastcgi_pass php-cgi;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$ud_uri;
include fastcgi_params;
}
}
location / {
root /var/www/data;
rewrite ^/wiki/([^?]*)(?:?(.*))? /w/index.php?title=$1&$2;
rewrite ^/wiki /w/index.php;
rewrite ^/edogawaconan/signature.jpg /edogawaconan/signature.php;
}
location ~ .php$ {
root /var/www/data;
try_files $uri @404;
fastcgi_pass php-cgi;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.ht {
deny all;
}
location @404 {
return 404;
}
}
Key changes here is everything is done in simplest possible way I can think of. No more location hopping.
If you need custom 404 just add if ($uri)
block. In the sample above I have my blog at /~edho/blog.
I use upstream block to prepare migration to god (from php-fpm).
Up next: god config for php-cgi. (aka say goodbye to spawn-fcgi / php-fpm)
Update: cleanup