首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过从路径中提取主机将Apache配置为反向代理

如何通过从路径中提取主机将Apache配置为反向代理
EN

Stack Overflow用户
提问于 2019-07-27 05:55:55
回答 2查看 1.2K关注 0票数 0

我想将Apache配置为的反向代理,它通过解析所请求的URL的路径来动态确定要代理的URL。

例如,URL http://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

代码语言:javascript
复制
ProxyPassMatch "^/app/([^/]+)(?:/(.*))?$" "http://$1:8000/$2"

我已经在mod_rewrite上试过了

代码语言:javascript
复制
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时,我得到了一个带有Location: /some/path/HTTP/1.1 301 Move Permanently响应。

我不知道301是从哪里来的。Apache和运行在该主机上的应用程序都不应该返回301,但是Location头让我认为可能是反向代理没有设置为正确地重写来自它所代理的远程的URL,这就是为什么我添加了上面的ProxyPassReverse指令。但我还是不能让它工作。

任何关于如何设置的洞察力都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 01:46:35

对于这个场景,我确实有错误地配置了ProxyPassReverse指令。

我代理的远程服务器(一个Django应用程序)通过将Location头设置为路径,而不是完整的URL来发出重定向。所以我不得不这样配置Apache:

代码语言:javascript
复制
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/。只有当Apache接收到Location: http://${CONTAINER}:8000/some/path/时,才会触发第一个ProxyPassReverse指令。

票数 1
EN

Stack Overflow用户

发布于 2019-07-27 06:05:11

默认情况下,mod_dir模块会将对没有尾部斜杠的目录路径的请求重定向到有尾部斜杠的目录路径。这是由DirectorySlash指令控制的。禁用DirectorySlash将关闭此行为:

代码语言:javascript
复制
DirectorySlash Off

使用curl指定-v以打印详细输出可能会很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57227408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档