我想将 Apache 配置为反向代理,通过解析请求的 URL 的路径来动态确定要代理的 URL。
例如,URLhttp://proxy-server/app/your-app
将被代理http://your-app:8000/
并http://proxy-server/app/your-app/some/path
转到http://your-app:8000/some/path
。
我在下面的配置中遇到的问题是它http://proxy-server/app/your-app/
工作得很好,但http://proxy-server/app/your-app/some/path
被重定向到http://proxy-server/some/path
,这会产生 404 错误。
我试过mod_proxy
像这样使用
ProxyPassMatch "^/app/([^/]+)(?:/(.*))?$" "http://$1:8000/$2"
我试过了 mod_rewrite
RewriteEngine On
RewriteBase "/app/"
RewriteRule "^([^/]+)/?$" "http://$1:8000/" [E=CONTAINER:$1,P]
RewriteRule "^([^/]+)/(.+)$" "http://$1:8000/$2" [E=CONTAINER:$1,P]
ProxyPassInterpolateEnv On
ProxyPassReverse "/app/" "http://${CONTAINER}:8000/" interpolate
当我curl -D - http://proxy-server/app/your-app
收到HTTP/1.1 200 OK
回复时。当我curl -D - http://proxy-server/app/your-app/some/path
我得到一个HTTP/1.1 301 Move Permanently
与响应Location: /some/path/
。
我不确定 301 来自哪里。Apache 和在该主机上运行的应用程序都不应该返回 301,但是Location
标头让我认为可能是反向代理没有设置为从它代理的远程正确重写 URL,这就是为什么我添加了ProxyPassReverse
上面的指令。但我仍然无法让它工作。
任何有关如何设置它的见解将不胜感激。
我确实ProxyPassReverse
为这个场景错误地配置了指令。
我代理的远程服务器(Django 应用程序)通过将Location
标头设置为路径而不是完整 URL 来发出重定向。所以我不得不像这样配置Apache:
RewriteEngine On
RewriteRule "^/app/([^/]+)(?:/.*)?$" - [E=CONTAINER:$1]
ProxyPassInterpolateEnv On
ProxyPass "/app/${CONTAINER}/" "http://${CONTAINER}:8000/" interpolate
ProxyPassReverse "/app/${CONTAINER}/" "http://${CONTAINER}:8000/" interpolate
# This guarantees that any Location headers that are just absolute paths
# get rewritten
ProxyPassReverse "/app/${CONTAINER}/" "/" interpolate
最后一行是关键。它告诉 Apache,如果它得到一个Location: /some/path/
标头,它应该将它重写为Location: /app/your-app/some/path/
. 第一个ProxyPassReverse
指令将引发只有当阿帕奇已经收到Location: http://${CONTAINER}:8000/some/path/
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句