删除子目录安装的 URL 上的“公共”吗?

删除子目录安装的 URL 上的“公共”吗?

这是 Laravel 的安装。Laravelpublic在 Nginx 中有单独的目录可以设置为 root。在我的设置中,我将其设置/var/www/web.dev/public为 root。

但是我在子目录中有许多其他单独的安装,可以从 访问http://web.dev/dev/1/public/http://web.dev/dev/2/public/等等。

public位于 、 等处的各个/var/www/web.dev/public/dev/1/public安装/var/www/web.dev/public/dev/2/public目录。

我想删除以便可以从、等处public访问它。http://web.dev/dev/1/http://web.dev/dev/2/

以下是我目前所做的操作(使用正则表达式删除publicURL):

server {
    server_name web.dev;
    root   /var/www/web.dev/public;
    index  index.php;
    location / {
        rewrite ^\/([^\/]*)\/([^\/]*)\/([^\/]*)$ /public/$3 break;
    }
    try_files $uri $uri/ /index.php?$args;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
}

我尝试了其他几个正则表达式,但仍然没有成功:

    location ^\/(.*)\/public {
        rewrite ^(.*)$ /public/$2 break;
    }

答案1

将其放置rewrite...breaklocation /块内意味着.phpURI 将不会被重写。

最简单的修复方法是将其移入块rewrite...breakserver并使用last

rewrite ^(/dev/[^/]+)((?!/public)/.*)?$ $1/public$2 last;

location / {
    try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
    ...
}

正则表达式具有否定前瞻断言,以防止多次添加/public。这种方法的一个限制是默认控制器也将是主网站(由语句定义try_files)。

这个文件了解更多信息。


我更倾向于将开发站点的配置分开,并用于alias构建文件路径。这样做的一个优点是文件不再需要放在主网站内。

location ~ ^(?<prefix>/dev/[^/]+)(?<suffix>/.*)?$ {
    alias /usr/local/www/test$prefix/public$suffix;

    if (!-e $request_filename) { rewrite ^(/dev/[^/]+) $1/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $request_filename;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
}

放置此块多于其他正则表达式位置块,因为正则表达式是按顺序求值的。请注意$request_filename的值的用法SCRIPT_FILENAME

这个文件更多信息。避免使用try_fileswithalias因为这个问题并注意这种警告关于 的使用if

相关内容