我有一个由 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;
在虚拟主机部分处理请求。