我想将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
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时,我得到了一个带有Location: /some/path/的HTTP/1.1 301 Move Permanently响应。
我不知道301是从哪里来的。Apache和运行在该主机上的应用程序都不应该返回301,但是Location头让我认为可能是反向代理没有设置为正确地重写来自它所代理的远程的URL,这就是为什么我添加了上面的ProxyPassReverse指令。但我还是不能让它工作。
任何关于如何设置的洞察力都将不胜感激。
发布于 2019-07-31 01:46:35
对于这个场景,我确实有错误地配置了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/。只有当Apache接收到Location: http://${CONTAINER}:8000/some/path/时,才会触发第一个ProxyPassReverse指令。
发布于 2019-07-27 06:05:11
默认情况下,mod_dir模块会将对没有尾部斜杠的目录路径的请求重定向到有尾部斜杠的目录路径。这是由DirectorySlash指令控制的。禁用DirectorySlash将关闭此行为:
DirectorySlash Off使用curl指定-v以打印详细输出可能会很有帮助。
https://stackoverflow.com/questions/57227408
复制相似问题