我对某些 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_NAME
和DOCUMENT_URI
变成了,/mediawiki/blah.php
而不是/w/blah.php
,这是不正确的,因为它们与请求 URL 无关。
我错过了什么? 有没有办法设置SCRIPT_FILENAME
以更好地匹配 nginx 已识别的文件,而无需使用重写规则?
答案1
你能发布完整的 NGINX 配置吗?我认为应该是这样的
location ~ ^/(wiki|w)/ {
root /local/mediawiki;
}
为了了解更多信息,我需要了解如何将脚本传递给 php。