仅当 Nginx 代理服务器上存在文件时才通过代理

仅当 Nginx 代理服务器上存在文件时才通过代理

我熟悉如果存在静态文件则提供该服务并将其余所有内容传递至index.php。

这个能和代理传递配合使用吗,以及静态文件是否存在于代理服务器上?

例如,假设我有这两台服务器:

服务器 1:

  • 索引.php
  • 样式表.css

服务器2(代理):

  • 关于/index.html
  • 联系方式.html

example.com 设置为解析到服务器 1。当请求传入时,nginx 配置查看传入的 URL,并查看它是否映射到服务器 2 上的文件。如果是,它会将请求代理到服务器 2 上的文件。如果文件不存在,它会将其保留在服务器 1 上。但是在服务器 1 上,它仍然优先选择存在的文件,并将其他路由映射到 index.php。

如果你觉得困惑,这里有一些例子

  • example.com/about --> 映射到服务器 2,about/index.html
  • example.com/contact.html --> 映射到服务器 2,contact.html
  • example.com/careers --> 映射到服务器 1,index.php
  • example.com/stylesheet.css --> 映射到服务器 1,stylesheet.css

如果两台服务器上存在相同的文件,则该文件应该映射到服务器 2。

答案1

免责声明:这不是操作反向代理的有效方法。

您将每个请求反向代理到服务器 2,如果该服务器无法满足请求,则会以 404 状态进行响应。

proxy_intercept_errors服务器 1 可以通过设置和 来处理 404 状态error_page

例如:

location / {
    proxy_pass ...;
    proxy_intercept_errors on;
    error_page 404 = @fallback;
}
location @fallback {
    try_files $uri /index.php;
}
location ~ \.php$ {
    try_files $uri =404;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $request_filename;
    fastcgi_pass    ...;
}

唯一的例外是,以结尾的 URI.php将不会首先发送到 server2。请参阅这个文件了解详情。

相关内容