仅在找不到文件时代理请求?

Proxy requests only if the file is not found?

我正在寻找 Redirect requests only if the file is not found? 的等价物,而不是重定向,我希望它在文件丢失时对另一台服务器执行 ProxyPass。

这不太好用,因为它不会处理不以“/”结尾的请求,例如https://site.trajano.net/trajano 转至代理并重定向。

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) - [L]
RewriteRule (.*) https://trajano.github.io/%{REQUEST_URI} [P]

我也从不同的答案中尝试了以下方法,效果稍好一些,但发生的是它重定向到 github 而不是代理。

RewriteCond %{DOCUMENT_ROOT}/ -f [OR]
RewriteCond %{DOCUMENT_ROOT}/ -d
RewriteRule (.*) - [S=2]
#
# Requested resource does not exist, do rewrite if it exists in /archive
RewriteCond %{DOCUMENT_ROOT}/archive/ -f [OR]
RewriteCond %{DOCUMENT_ROOT}/archive/ -d
RewriteRule (.*) /archive/ [L]
#
# Else
RewriteRule (.*) https://trajano.github.io/%{REQUEST_URI} [P]

mod_rewritemod_proxy 都需要启用。将以下内容放在 VirtualHost 块中(不在 Directory 指令或 VirtualHost 以外的任何内容中):

RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/ -f [OR]
RewriteCond %{DOCUMENT_ROOT}/ -d
RewriteRule (.*) - [L]
#
# Else proxy
RewriteRule ^/(.*)$ https://trajano.github.io/ [P,QSA]
ProxyPassReverse / https://trajano.github.io/

第一个重写块处理存在的文件和目录,在这种情况下它 returns 原始文件块。

下一个重写规则将处理代理。 ProxyPassReverse 确保返回的 Location 被重写回本地服务器而不是代理服务器。