Help getting subdir-installation to work

I want to install the Laravel PHP-app invoiceninja 5 into a subdirectory, e.g. https://www.example.com/invoiceninja5/.
However I can’t get the nginx-configuration to work. Here’s my latest of many attempt: invoiceninja5_ynh/nginx.conf at 897af1109492b3534770640244e2b017b2fee02c · YunoHost-Apps/invoiceninja5_ynh · GitHub

#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent;

location ^~ __PATH__/ {

  # Path to source
  alias __FINALPATH__/public/;

  try_files $uri $uri/ index.php?q=;

  if (!-e $request_filename) {
    rewrite ^(.+)$ __PATH__/index.php?q= last;
  }

  # Add headers to serve security related headers
  more_set_headers "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload;";
  more_set_headers "X-Content-Type-Options: nosniff";
  more_set_headers "X-XSS-Protection: 1; mode=block";
  more_set_headers "X-Robots-Tag: none";
  more_set_headers "X-Download-Options: noopen";
  more_set_headers "X-Permitted-Cross-Domain-Policies: none";
  more_set_headers "Referrer-Policy: no-referrer";

  index index.php index.html index.htm;

  location ~ ^__PATH__/index\.php(/.*|)$ {
    fastcgi_split_path_info ^(.+?\.php)(/.*|)$;
    set $path_info $fastcgi_path_info;
    fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock;

    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $request_filename;
  }
  # Adding the cache control header for js and css files
  location ~ \.(?:css|js|woff2?|svg|gif)$ {
    try_files $uri __PATH__/index.php$request_uri;
    more_set_headers "Cache-Control: public, max-age=15778463";
    # Add headers to serve security related headers
    more_set_headers "Strict-Transport-Security: max-age=15768000";
    more_set_headers "X-Content-Type-Options: nosniff";
    more_set_headers "X-XSS-Protection: 1; mode=block";
    more_set_headers "X-Robots-Tag: none";
    more_set_headers "X-Download-Options: noopen";
    more_set_headers "X-Permitted-Cross-Domain-Policies: none";
    more_set_headers "Referrer-Policy: no-referrer";

    # Optional: Don't log access to assets
    access_log off;
  }

  location ~* \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
    try_files $uri __FINALPATH__/public/index.php$request_uri;
    # Optional: Don't log access to other assets
    access_log off;
  }

    # Include SSOWAT user panel.
    include conf.d/yunohost_panel.conf.inc;
}

Here’s the accompanying PR if you want to try it yourself: GitHub - YunoHost-Apps/invoiceninja5_ynh at 5.3.1

Here’s the command to install it:

sudo yunohost app install https://github.com/YunoHost-Apps/invoiceninja5_ynh/tree/5.3.1 -f -a "domain=YOURDOMAIN&path=/invoiceninja5&admin=YOURADMIN&language=en&is_public=1&password=password"

The problem is that https://www.example.com/invoiceninja5/ should display the login-page, instead it displays a 404-error from Laravel. This is probably because the app is available at https://www.example.com/invoiceninja5/index.php, but the redirect/removal of/to index.php doesn’t seem to work.

Can anyone help me here?

There is a ridiculously long-standing bug in NGINX when alias and try_files directives are involved.

For reference: NGINX try_files + alias directives - Stack Overflow

You can have a look into Flarum package’s NGINX configuration to see a workaround.

1 Like

I can’t get it to work. I tried many different settings to no avail:

 rewrite ^/invoiceninja5$ /invoiceninja5/ permanent;

#location ^~ /invoiceninja5/ {
location /invoiceninja5/ {

  # Path to source
  alias /var/www/invoiceninja5/public/;

  index index.php;

  try_files $uri $uri/ index.php?q=;
  #try_files $uri $uri/ invoiceninja5/index.php?q=;
  #try_files $uri $uri/ /invoiceninja5/index.php?q=;
  #try_files $uri $uri/ /invoiceninja5//invoiceninja5/index.php?q=;

  #location ~* ^/invoiceninja5/.*\.php$ {
  location ~* ^/.*\.php$ {
  #location ~* \.php$ {
    fastcgi_split_path_info ^(.+.php)(/.+)$;
    set $path_info $fastcgi_path_info;
    fastcgi_pass unix:/var/run/php/php7.4-fpm-invoiceninja5.sock;

    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $request_filename;
  }
}