![仅当 Nginx 代理服务器上存在文件时才通过代理](https://linux22.com/image/740784/%E4%BB%85%E5%BD%93%20Nginx%20%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E5%AD%98%E5%9C%A8%E6%96%87%E4%BB%B6%E6%97%B6%E6%89%8D%E9%80%9A%E8%BF%87%E4%BB%A3%E7%90%86.png)
我熟悉如果存在静态文件则提供该服务并将其余所有内容传递至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。请参阅这个文件了解详情。