使用 nginx 在一个路径/位置提供多个目录

joh*_*ano 3 rewrite nginx

我一直在尝试在一个位置提供多个目录,以便所有文件都可以在 /sys/assets/--FILE-- 上访问,无论文件在以下文件夹中的物理位置如何

location /sys {
    alias /var/www/website_api/sys/public;
    try_files $uri $uri/ /sys/index.php$is_args$args;
    location ~ \.php {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    include /etc/nginx/fastcgi_params;
    }
        location /sys/assets {
           alias /var/www/website_api/sys/app/assets/javascripts/;
        }
        location /sys/assets {
           alias /var/www/website_api/sys/app/assets/stylesheets/;
        }
        location /sys/assets {
           alias /var/www/website_api/sys/app/assets/images/;
        }
}
Run Code Online (Sandbox Code Playgroud)

目标:

/sys/assets/javascriptFile.js
/sys/assets/stylesheetFile.css
/sys/assets/image.png
Run Code Online (Sandbox Code Playgroud)

Xav*_*cas 5

您的配置中不能有重复的前缀位置。但是,使用try_files指令可以执行您期望的操作:

location /sys {

    alias /var/www/website_api/sys/public;
    try_files $uri $uri/ /sys/index.php$is_args$args;

    location ~ \.php {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        include /etc/nginx/fastcgi_params;
    }

    location ~ ^/sys/assets/?(.*)$ {
        root /var/www/website_api/sys/app/assets;
        try_files /javascripts/$1 /stylesheets/$1 /assets/images/$1;
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您绝对需要避免不适当的文件系统查找(即stat()Linux 下的内核调用),您还可以使用匹配合适文件扩展名的多个正则表达式位置来更精确地执行此操作:

location /sys {

    alias /var/www/website_api/sys/public;
    try_files $uri $uri/ /sys/index.php$is_args$args;

    location ~ \.php {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        include /etc/nginx/fastcgi_params;
    }

    location ~ ^/sys/assets/?.*\.css$ {
        rewrite '^/sys/assets/(.*)$' '/$1' break;
        root /var/www/website_api/sys/app/assets/stylesheets;
    }

    location ~ ^/sys/assets/?.*\.(gif|ico|jpe?g|png|svg)$ {
        rewrite '^/sys/assets/(.*)$' '/$1' break;
        root /var/www/website_api/sys/app/assets/images;
    }

    location ~ ^/sys/assets/?.*\.js$ {
        rewrite '^/sys/assets/(.*)$' '/$1' break;
        root /var/www/website_api/sys/app/assets/javascripts;
    }

}
Run Code Online (Sandbox Code Playgroud)