Nginx 在不更改服务器根目录的情况下将根目录重写为子文件夹

Nginx 在不更改服务器根目录的情况下将根目录重写为子文件夹

我正在尝试将旧应用程序从 apache 移动到 nginx,但在这里我停滞了。

/.htaccess

RewriteEngine on
RewriteRule ^(.*) public/$1 [L]

/public/.htaccess

Options +Indexes +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

结构非常简单。这款应用有

./application
    ./*back-end*
./vendor 
    ./*back-end includes*
./public 
    ./public/.htaccess <- this one
    ./*front-end*
./tests
./.htaccess <- this one

我让它工作的唯一方法是将服务器更改root./public并添加

location / {
    if (!-d $request_filename){ set $rule_0 1$rule_0; }
    if (!-f $request_filename){ set $rule_0 2$rule_0; }
    if ($request_filename !~ "-l"){ set $rule_0 3$rule_0; }
    if ($rule_0 = "321"){ 
        rewrite ^/(.+)$ /index.php?url=$1 last; 
    }
} #from winginx convertor

但这样一来,我的./public文件夹外部就被遗漏了,应用程序就坏了。所以我正在寻找一种不排除后端文件夹的方法来重写它。

答案1

重置文档root 返回顶部。 尝试这个:

location / {
    try_files $uri $uri/ @public;
}
location @public {
    rewrite ^ /public$request_uri last;
}
location /public {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /public/index.php?url=$1 last;
}

第一个和第二个位置块将为后端文件提供服务,并确保其他任何内容都被重写入文件/public夹(您的第一个.htaccess规则集)。

第三和第四个位置块将提供来自公共文件夹的文件(如果存在),否则调用脚本/public/index.php

我认为你已经有一个PHP 位置块

上述操作可能有些过度(我只是遵循你的 Apache 实现),而这也可能有效(跳过几个步骤):

location / {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/(.*)$ /public/index.php?url=$1 last;
}

如果您不介意url参数中以斜杠开头,则可以简化为:

location / {
    try_files $uri $uri/ /public/index.php?url=$uri;
}

了解更多信息。

相关内容