标签: reverse-proxy

如何在反向代理后面正确设置JSESSIONID cookie路径

我的Web应用程序在Tomcat中运行,http://localhost:8080/example.com/但它正在从http://example.com/端口80上提供的Apache进行反向代理.我的Web应用程序查看request.getHeader("x-forwarded-host")标头以了解它是在反向代理之后.当它(动态地)检测到它时,它会在没有servlet路径的情况下构建URL.

这适用于除JSESSIONID cookie之外的所有内容.它通过路径/example.com而不是/通过反向代理访问时设置.我无法弄清楚当代码上有x-forwarded-host标题时,我的代码如何告诉Tomcat覆盖该cookie的路径.

我自己尝试从Web应用程序设置JSESSIONID cookie,但这只会产生两个Set-Cookie标头,其中只有一个是正确的.

tomcat reverse-proxy jsessionid

24
推荐指数
3
解决办法
4万
查看次数

nginx proxy_pass到链接的docker容器

我有两个带nginx的docker容器.container1链接到container2.Docker然后在/ etc/hosts中添加一个条目,我将其输入到nginx配置中,如下所示:

server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://container1/$1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以从container2 ping 容器1,但是nginx无法解析它:

*1没有定义解析容器1的解析器

我怎样才能将请求委托给另一个docker容器?

reverse-proxy nginx docker

24
推荐指数
3
解决办法
1万
查看次数

避免在proxy_pass上使用nginx解码查询参数(相当于AllowEncodedSlashes NoDecode)

我使用nginx作为几个tomcats前面的负载balencer.在我的传入请求中,我编码了查询参数.但是当请求到达tomcat时,参数被解码:

传入nginx的请求:

curl -i "http://server/1.1/json/T;cID=1234;pID=1200;rF=http%3A%2F%2Fwww.google.com%2F"
Run Code Online (Sandbox Code Playgroud)

传入tomcat的请求:

curl -i "http://server/1.1/json/T;cID=1234;pID=1200;rF=http:/www.google.com/"
Run Code Online (Sandbox Code Playgroud)

我不希望我的请求参数被转换,因为在那种情况下我的tomcat会抛出405错误.

我的nginx配置如下:

upstream tracking  {
    server front-01.server.com:8080;
    server front-02.server.com:8080;
    server front-03.server.com:8080;
    server front-04.server.com:8080;
}

server {
    listen 80;
    server_name tracking.server.com;
    access_log /var/log/nginx/tracking-access.log;
    error_log  /var/log/nginx/tracking-error.log;

    location / {
        proxy_pass  http://tracking/webapp;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我当前的apache负载均衡器配置中,我有AllowEncodedSlashes指令来保留我的编码参数:

AllowEncodedSlashes NoDecode
Run Code Online (Sandbox Code Playgroud)

我需要从apache转移到nginx.

我的问题与这个问题完全相反:避免nginx在proxy_pass上转义查询参数

reverse-proxy load-balancing nginx

23
推荐指数
4
解决办法
3万
查看次数

詹金斯为什么抱怨我的反向代理设置被破坏了?

我不知道为什么在Jenkins更新到版本1.591(Ubuntu Server 12.04)之后,最初正确设置的反向代理现在变得破碎了.我当前的设置与Jenkins wiki中的设置完全相同:

ProxyPass /jenkins http://localhost:8081/jenkins nocanon
ProxyPassReverse /jenkins http://localhost:8081/jenkins
ProxyPreserveHost On
ProxyRequests Off
AllowEncodedSlashes NoDecode
<Proxy http://localhost:8081/jenkins*>
Order deny,allow
Allow from all
</Proxy>
Run Code Online (Sandbox Code Playgroud)

--prefix=/jenkins已被添加到/etc/default/jenkins文件中

这是詹金斯的错误吗?

apache configuration tomcat reverse-proxy jenkins

23
推荐指数
4
解决办法
3万
查看次数

如何配置nginx X-Forwarded-Port为原始请求端口

我在标准反向代理场景中使用 nginx,将所有请求传递/auth到另一台主机,但是我正在尝试使用非标准端口。

我的最终目标是将X-Forwarded-Port标头设置为请求进入的端口。

这是我在 nginx.conf 中的位置块:

location /auth/ {
    proxy_pass       http://otherhost:8090;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port <VAR>;
}
Run Code Online (Sandbox Code Playgroud)

这个 nginx 运行在一个 docker 容器中,该容器被配置为将请求从 8085 转发到容器中的 80,这样 nginx 进程就可以监听 80:

0.0.0.0:8085->80/tcp

当我点击网址时:

http://localhost:8085/auth/

我正确重定向到http://otherhost:8090,但X-Forwarded-Port标题丢失或错误。

<VAR>原始块中,我尝试了以下操作:

  • $server_port - 这是 nginx 正在侦听的端口 (80),而不是请求端口。

  • $pass_port - 在我的设置中似乎为空,因此 nginx 删除了标头。

  • $http_port - 这是每个请求的随机端口。

  • $remote_port - 这是每个请求的随机端口。

可以在部署时将我的配置更改为硬编码到传入请求的已知端口,但理想情况下,我将能够更改前端端口,而无需对 nginx 配置进行任何更改。

我已经搜索了 …

reverse-proxy nginx docker x-forwarded-for nginx-reverse-proxy

23
推荐指数
3
解决办法
1万
查看次数

ProxyHTML重写URL

我已经设置了2个apache服务器.一个在端口80上,另一个在端口8077上.我想通过反向代理在8077上查看服务器上的所有内容.目前我有:

ProxyPreserveHost Off
ProxyHTMLInterp On
ProxyPass /translate/ http://www.example.com:8077/
ProxyPassReverse /translate/ http://www.example.com:8077/
ProxyHTMLURLMap / /translate/
Run Code Online (Sandbox Code Playgroud)

这允许我到达网站的初始页面,但图像,CSS和其他页面的链接不起作用.

例如,html中的css显示为

/css/style.css
Run Code Online (Sandbox Code Playgroud)

我真正希望它在哪里

/translate/css/style.css
Run Code Online (Sandbox Code Playgroud)

它从8077服务器获取文件.如何使用当前设置才能使其正常工作?

apache reverse-proxy apache2 mod-proxy-html

22
推荐指数
1
解决办法
3万
查看次数

使Java servlet充当代理的代码?

我有两个Java Web应用程序,它们具有映射到特定URL的单个servlet:

red.war/
    WEB-INF/classes
        com.me.myorg.red.RedServlet (maps to http://red.example.com/doStuff)
blue.war/
    WEB-INF/classes
        com.me.myorg.blue.BlueServlet (maps to http://blue.example.com/doStuff)
Run Code Online (Sandbox Code Playgroud)

我想把这些应用程序(我称之为"后端应用程序")放在"代理应用程序"(servlet)后面,这将决定这两个应用程序中的哪一个最终将服务于客户端请求.

此代理Web应用程序将接收传入的HTTP请求,并确定将请求转发到的2个"后端应用程序"(红色或蓝色)中的哪一个.然后,请求将转发到http://red.example.com/doStuff(或然后由其处理RedServlet#doGet(...))或http://blue.example.com/doStuff(然后由其处理BlueServlet#doGet(...)).然后,来自后端应用程序的返回响应(再次,RedServlet#doGet(...)或者BlueServlet#doGet(...))将返回到代理servlet,并最终返回给客户端.

换句话说,在伪代码中:

public class ProxyServlet extends HttpServlet {
    @Override
    public doGet(HttpServletRequest request, HttpServletResponse response) {
        String forwardingAddress;
        if(shouldBeRed(request))
            forwardingAddress = "http://red.example.com/doStuff";
        else
            forwardingAddress = "http://blue.example.com/doStuff";

        PrintWriter writer = response.getWriter();

        writer.write(getResponseFromBackend(forwardingAddress, request));
    }

    private String getResponseFromBackend(String addr, HttpServletRequest req) {
        // Somehow forward req to addr and get HTML response...
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?如果是这样,我需要编写的代码和代码才能使其工作?

java servlets reverse-proxy web-applications http

22
推荐指数
1
解决办法
3万
查看次数

最简单的反向代理

我正在寻找一种简单地在本地设置连接到远程站点的代理的方法.我不想在系统中安装任何东西.如果我可以通过单个命令行调用来调用它,而不是使用单个配置文件,那就太棒了.

目的是嗅探我正在开发的本地应用程序与其他人提供并使用HTTPS的远程服务器之间的流量.

最好是Ruby,Python或Node包,这样我就可以按照以下方式做一些事情:

mkdir simplest-proxy; cd simplest-proxy; bundle init
echo "gem 'simplest-proxy'" >> Gemfile; bundle --path vendor/bundle
bundle exec bin/simplest-proxy -p 8080 https://remote.site.example.com/
Run Code Online (Sandbox Code Playgroud)

要么

virtualenv simplest-proxy; cd simplest-proxy
bin/easy_install simplest-proxy
bin/simplest-proxy -p 8080 https://remote.site.example.com/
Run Code Online (Sandbox Code Playgroud)

要么

mkdir simplest-proxy; cd simplest-proxy
npm install simplest-proxy
node_modules/.bin/simplest-proxy -p 8080 https://remote.site.example.com/
Run Code Online (Sandbox Code Playgroud)

它将允许我的应用程序连接到localhost:8080,它将转发请求(并重写Host标题和其他任何必要的)到远程站点.我可以lo在WireShark中观看并了解发生了什么.

我已经快速浏览了pypi,rubygems和npm,但是到目前为止我发现的要么是不工作(proxylet否则看起来很有希望),用于更复杂的场景并需要设置(dj-revproxy)或期望是用正确的Host(node-reverse-proxy)调用而不是重写.

更新:我现在正在使用带有ProxyPass/ ProxyPassReverseconfig 的Apache ,但它感觉有点过分,需要使用配置文件.

更新:另一个不适用的解决方案是实际的HTTP代理,而不是模拟远程站点的代理.因为远程站点是一个HTTPS站点,这只会使我的应用程序在代理中执行CONNECT并且没有获得任何内容.

ruby python reverse-proxy node.js

22
推荐指数
1
解决办法
2万
查看次数

如何在Nginx日志中记录反向代理上游服务器服务请求?

我们使用Nginx作为此设置的反向代理:

upstream frontends {
  server 127.0.0.1:8000;
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  [...]
}

server {
  location / {
    proxy_pass http://frontends;
    [...]
  }
  [...]
}
Run Code Online (Sandbox Code Playgroud)

作为访问日志的一部分,我想记录为请求提供服务的上游服务器,在我们的例子中,这意味着关联的localhost端口.

文档中的变量(http://wiki.nginx.org/HttpProxyModule#Variables)提到$ proxy_host和$ proxy_port,但在日志中它们总是以"frontends"和"80"的值结束.

reverse-proxy nginx

22
推荐指数
2
解决办法
4万
查看次数

Apache端口转发

我在http:// localhost:5984 /上运行了apache couchDB ,我需要访问http:// localhost:80/couch /.我需要为此设置反向proxi.需要有关配置设置的帮助.

PS:什么是了解apache的最佳资源?

apache proxy reverse-proxy apache2 mod-proxy

21
推荐指数
1
解决办法
3万
查看次数