0

My server has a root directory which is /home/forge/example.com/current/ionic/www and a secondary API PHP directory, located /home/forge/example.com/current/public.

When the user browses to example.com/api the website should load from /home/forge/example.com/current/public (which is different from the root).

I have been able to successfully configure this using alias and load index.html, however php files are not loading.

I have discovered on StackExchange, that this is due to a long-standing bug with Nginx.

I've read a couple of posts, where the workaround is to re-write the URL.

How to use Nginx alias to load PHP from other directory?

How can I get around using alias in nginx?

Here is my sites-available file.

# FORGE CONFIG (DO NOT REMOVE!)
include forge-conf/example.com/before/*;

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;
    root /home/forge/example.com/current/ionic/www;

 #   location /api {
 #       alias /home/forge/example.com/current/public;

        location /api {
        root /home/forge/example.com/current/public;
        rewrite ^/api/(.*)$ /$1 break;
        try_files $uri /system/index.php?r=$uri;



    index index.php;

    }
    # FORGE SSL (DO NOT REMOVE!)
    ssl_certificate /etc/nginx/ssl/example.com/381129/server.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/381129/server.key;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/dhparams.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DO NOT REMOVE!)
    include forge-conf/example.com/server/*;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/example.com-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

# FORGE CONFIG (DO NOT REMOVE!)
include forge-conf/example.com/after/*;
ceejayoz
  • 32,910
  • 7
  • 82
  • 106
Ian Arman
  • 123
  • 3
  • 8
  • 15
  • Have you considered a subdomain for the API? `api.example.com`? – ceejayoz Jul 20 '18 at 19:22
  • You can create another PHP pool on another port, then within an Nginx location call the other PHP pool for the API. This way all the settings for the website and API can be independent. – Tim Jul 20 '18 at 19:35
  • You need a nested `location` to process `.php` URIs within the API PHP directory. See [this answer](https://serverfault.com/questions/876332/nginx-php-fpm-uri-alias-and-multiple-php-directories/876349#876349) for details. If you want to avoid the `alias`/`try_files` problem - see [my other answer](https://stackoverflow.com/questions/45287201/wordpress-laravel-and-nginx/45297857#45297857) on SO. – Richard Smith Jul 20 '18 at 19:53

0 Answers0