skip to Main Content

Here is my default.conf file:

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

    root /var/www/html/;
    server_name example.com;

    # Site 01
    location /* {
        alias /var/www/html/home/;
        index index.htm index.php;
        try_files $uri $uri/ /home/index.html;
    }

    # Site 2
    location /shadows {
        alias /var/www/html/shadows/;
        index index.htm index.php;
        try_files $uri $uri/ /shadows/index.php;
    }

    error_page 404 /error/404.php;
    fastcgi_intercept_errors on;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}

I have a Codeigniter app in

var/www/html/shadows

I also have a HTML site in

var/www/html/home

The issue:

I have been able to make this work for the directories home or shadows but not both.

If I change root to /var/www/html/home the HTML site pops up.

Currently just the shadows codeigniter site pops up with this configuration.

Please let me know your thoughts on resolving this. Thank you very much.

2

Answers


  1. If I understand you correctly, something like this should work:

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
    
        server_name example.com;
    
        root /var/www/html/home;
    
        location /shadows {
            root /var/www/html;
            index index.php;
        }
    }
    

    http://example.com/shadows/index.php will resolve to path /var/www/html/shadows/index.php in this case.

    Login or Signup to reply.
  2. You can get the root directive value via the map block:

    map $uri $approot {
        ~^/shadows/    /var/www/html;
        default        /var/www/html/home;
    }
    server {
        listen 80;
        listen [::]:80;
    
        root $approot;
        server_name example.com;
    
        # Site 01
        location / {
            index index.htm index.php;
            try_files $uri $uri/ /index.html;
        }
    
        # Site 2
        location /shadows/ {
            index index.htm index.php;
            try_files $uri $uri/ /shadows/index.php$is_args$args;
        }
    
        error_page 404 /error/404.php;
        fastcgi_intercept_errors on;
    
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    
        location ~ .php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }
    }
    

    I’m assuming your HTML site should be served under the root prefix /, not the /home/, therefore I changed your try_files $uri $uri/ /home/index.html; directive to the try_files $uri $uri/ /index.html;. I also replaced all your alias directives with root ones. As it said by the alias directive documentation

    When location matches the last part of the directive’s value:

    location /images/ {
        alias /data/w3/images/;
    }
    

    it is better to use the root directive instead:

    location /images/ {
        root /data/w3;
    }
    

    Additionally there is a well-known bug when you are using alias and try_files directives together, so using the root one instead is more reliable.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search