这是 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/
以下是我目前所做的操作(使用正则表达式删除public
URL):
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...break
在location /
块内意味着.php
URI 将不会被重写。
最简单的修复方法是将其移入块rewrite...break
中server
并使用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
。