NGINX 两个目录一个 URL (Codeigniter, HTML)

NGINX Two Directories One URL (Codeigniter, HTML)

这是我的 default.conf 文件:

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;
    }
}

我在

中有一个 Codeigniter 应用程序
var/www/html/shadows

我在

也有一个HTML网站
var/www/html/home

问题:

我已经能够为 home 目录或 shadows 目录工作,但不能同时为两者工作。

如果我将 root 更改为 /var/www/html/home,则会弹出 HTML 站点。

目前只有 shadows codeigniter 站点使用此配置弹出。

请告诉我您对解决此问题的想法。非常感谢。

如果我对你的理解正确,这样的事情应该有效:

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 将解析为路径 /var/www/html/shadows/index.php

您可以通过 map 块获取 root 指令值:

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;
    }
}

我假设您的 HTML 站点应该在根前缀 / 下提供服务,而不是 /home/,因此我将您的 try_files $uri $uri/ /home/index.html; 指令更改为 try_files $uri $uri/ /index.html;。我还将所有 alias 指令替换为 root 指令。正如 alias 指令所说 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;
}

此外,当您同时使用 aliastry_files 指令时,还有一个众所周知的 bug,因此使用 root 指令更可靠。