apache - 如何通过从路径中提取主机来将 Apache 配置为反向代理
问题描述
我想将 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
Apache 收到Location: http://${CONTAINER}:8000/some/path/
.
推荐阅读
- reactjs - CSS flex 子组件必须让子组件无法正确装入 3x2 flex 容器
- python-3.x - 使用 Django REST 框架获取与基本模型实例相关的所有模型的序列化响应
- python - 如何解决不支持 RELATIVE-OID 的 ASN.1 库
- tfs - VSTS 构建代理 web 代理配置
- java - 模板解析时出错(模板:“类路径资源 [templates/user-form/user-signup.html]”)
- visual-studio-2010 - C# 功能中的可选参数
- activemq-artemis - ActiveMQ Artemis 故障转移与集群
- omnet++ - 运行 Omnet 模拟时出现问题(退出代码 1)
- assembly - MARS MIPS 模拟器执行窗口不会展开
- typescript - 在 axios 中运行循环时抛出错误