![Windows 上跨多个驱动器的 NGINX try_files](https://linux22.com/image/776732/Windows%20%E4%B8%8A%E8%B7%A8%E5%A4%9A%E4%B8%AA%E9%A9%B1%E5%8A%A8%E5%99%A8%E7%9A%84%20NGINX%20try_files.png)
出于性能原因,我正在将 nginx 从 Linux VM 移到 Windows 主机,但在此部分我遇到了问题。
在 Linux 上,配置为:
root /;
try_files /mnt/m$uri /mnt/d$uri /mnt/l$uri =404;
其中 /mnt/m、/mnt/d 和 /mnt/l 分别是 M:、D: 和 L: 驱动器的挂载点。
在 Windows 上我尝试过
root /;
try_files M:$uri D:$uri L:$uri =404;
但它会抛出这个错误
*1 GetFileAttributesEx() "C:L:/[...]" failed (123: The filename, directory name, or volume label syntax is incorrect)
它似乎/
被解释为 C: 驱动器,它是 nginx 运行的驱动器。我也尝试过root ;
完全省略 root 指令,但没有任何效果。
答案1
我设法通过嵌套命名位置来实现这一点。不过要小心,因为至少根据我的经验,您在主位置块中设置的任何标题/选项都不会应用于命名位置。@IvanShatsky 使用 NTFS 挂载点的解决方案似乎要好得多。
location / {
root "M:\\";
try_files $uri $uri/ @ddrive;
}
location @ddrive {
root "D:\\";
try_files $uri $uri/ @ldrive;
}
location @ldrive {
root "L:\\";
try_files $uri $uri/ =404;
}
答案2
我认为 Windows 上的 mklink 可能是一个解决方案。
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mklink
您可以使用以下命令将已挂载的磁盘链接到例如 C:\mnt\M、C:\mnt\D、C:\mnt\L:
mklink /D C:\mnt\M M:
mklink /D C:\mnt\D D:
mklink /D C:\mnt\L L:
然后在 nginx.conf 中
...
root C:/mnt/;
try_files /M/$uri /D/$uri /L/$uri =404;
...