Nginx 动态子文件夹作为 fastcgi_param

Nginx 动态子文件夹作为 fastcgi_param

我有一个由 Nginx 提供服务的 PHP 网站。我希望能够通过不同的子文件夹访问它。基本上,用户可以注册,注册后选择设置“url”。基于此,他们将像这样访问该网站:

example.com/{url}

我也可以接受类似这样的事情:

example.com/s/{url}

如果这有助于检测它。

我希望 Nginx 抓取该 URL 并使用 fastcgi_param 将其传递给 PHP。此外,我希望 PHP 的行为就像仅通过 访问该站点一样example.com。因此,例如example.com/s/{url}/about就等同于example.com/about

答案1

如果我理解正确的话,您需要从传递给 PHP 的 URL 中删除站点 URL 路径组件的第一部分。您可以这样做:

location ~ ^(?<userurl>[^/]+)(<dest>/.+)$ {
    rewrite ^ $dest break;
}

因此,这将改变 URL,如下所示:

http://example.com/about/something变成http://example.com/something

http://example.com/about变成http://example.com/

正则表达式还将第一个之后的部分捕获/到变量中$userurl,您可以在其中使用fastcgi_param该变量将 URL 的一部分传递给 PHP 脚本。

但是,我建议不要将工作分摊到 nginx 和 PHP 脚本中,而是在 PHP 脚本中实现前端控制器模式。这意味着,它将$_SERVER['REQUEST_URI']根据您在 PHP 中实现的规则解析和处理请求。

然后,在 nginx 中只需添加:

try_files $uri $uri/ /index.php;

在虚拟主机部分处理请求。

相关内容