I tried multiple combinations but I must be missing something. Closer I got is with the following config file, I get static content in /var/www/html and /home/user/www, but php only works in the server root, I get 404 on userdir.

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        include snippets/self-signed.conf;
        include snippets/ssl-params.conf;

        root /var/www/html;

        index index.html index.htm index.php;


        location / {
                try_files $uri $uri/ =404;
                autoindex on;

        location ~ ^/~(.+?)(/.+\.php)$ {
                alias /home/$1/www$2;

                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;


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

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        location ~ /\. {
                deny all;

server {
        listen 80;
        listen [::]:80;


        return 301 https://$server_name$request_uri;

Any help appreciated.

EDIT: I looked into it, but still can't get it to work. fastcgi-php.conf says:

fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $fastcgi_script_name =404;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;

And in fastcgi.conf whether I set SCRIPT_FILENAME to $document_root$fastcgi_script_name or $request_filename I still get 404 with php files in /home/user/www.


fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
  • It probably depends on what you have in snippets/fastcgi-php.conf. The important parameter is SCRIPT_FILENAME which needs to be set to $request_filename to work with alias as well as root. – Richard Smith Mar 10 at 18:27
  • Thanks for the tip, but it doesn't seem to do the trick @RichardSmith – Eric Mar 10 at 19:26

When using alias, the value of $document_root$fastcgi_script_name does not point to the requested file. You can use $request_filename which will work for both the root and alias cases.

Also, the try_files statement, using $fastcgi_script_name will always fail and force a 404 response.

Replace the try_files $fastcgi_script_name =404 and fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name statements with:

if (!-f $request_filename) { return 404; }
fastcgi_param SCRIPT_FILENAME $request_filename;

The above works for both the root and alias case.

  • Alas I'm still getting 404 on php files in userdir. I added the fastcgi.confcontent to the post, don't know if another parameters could be affecting this. – Eric Mar 10 at 21:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.