Nginx

如果文件存在於使用 Nginx 的代理伺服器上,則僅代理通過

  • July 27, 2019

我熟悉提供靜態文件(如果存在)並將其他所有內容傳遞給 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。

免責聲明:這不是操作反向代理的有效方式。

您將每個請求反向代理到伺服器 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。有關詳細資訊,請參閱此文件

引用自:https://serverfault.com/questions/976920