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

时间:2017-04-15 00:52:19

标签: apache mod-rewrite reverse-proxy

我正在寻找等价的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}/$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]

1 个答案:

答案 0 :(得分:1)

需要启用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/

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

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