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

Arc*_*ano 5 apache mod-rewrite reverse-proxy

仅当找不到文件时,我才在寻找等效的重定向请求?如果文件丢失,我希望它对另一台服务器执行 ProxyPass 而不是重定向。

这并没有很好地工作,因为它不会处理不以“/”结尾的请求,例如https://site.trajano.net/trajano,它转到代理并改为 redrects。

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

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

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

Arc*_*ano 5

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

RewriteEngine on

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

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

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