具有多个服务器根路径的 Nginx 上的 PHP 脚本路径不一致

具有多个服务器根路径的 Nginx 上的 PHP 脚本路径不一致

我对某些 nginx 配置有些困惑。本质上,我有一个文件系统文件夹 ( /remote),用于托管 Web 内容/,但在此基础上,我想要虚拟路径/w/wiki它将托管来自完全不同的文件系统文件夹 ( ) 的 MediaWiki 实例/local

换句话说,我试图像这样处理 URL:

  • /anything.php-> 运行/remote/anything.php
  • /wiki/anything-> 重写为/w/index.php?title=anything
  • /w/index.php-> 运行/local/mediawiki/index.php

原因是我将 MediaWiki 代码放在临时存储中(每次启动时重新创建),但数据文件(以及网站的其余部分)放在永久存储中,因此路径不同。

由于存在多个服务器根路径,我被绊倒了。

如果我这样做:

location /w/ {
    alias /local/mediawiki;

    location ~ [^/]\.php(/|$) {
        ...
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;

然后根据 nginx 文档,对 的请求/w/blah.php应该被/w丢弃,以便从 提供服务/local/mediawiki/blah.php。然而,虽然这种情况可能发生在静态文件中,但它不会发生在 FastCGI 文件中,因为SCRIPT_FILENAME它告诉 PHP 运行/local/mediawiki/w/blah.php- 它不会砍掉该/w部分 - 因此 PHP FPM 返回 404,因为它找不到该.php文件。

相反,我尝试使用rewrite但这也不起作用:

location /w/ {
    rewrite ^/w/(.*)$ /mediawiki/$1 last;
}
location /mediawiki/ {
    internal;
    root /local;
    ...

这次,SCRIPT_FILENAME正确设置为/local/mediawiki/blah.php,只是其他变量现在发生了变化,所以SCRIPT_NAMEDOCUMENT_URI变成了,/mediawiki/blah.php而不是/w/blah.php,这是不正确的,因为它们与请求 URL 无关。

我错过了什么? 有没有办法设置SCRIPT_FILENAME以更好地匹配 nginx 已识别的文件,而无需使用重写规则?

答案1

你能发布完整的 NGINX 配置吗?我认为应该是这样的

location ~ ^/(wiki|w)/ {
    root /local/mediawiki;
}

为了了解更多信息,我需要了解如何将脚本传递给 php。

相关内容