有没有人知道如何在反向代理模式下告诉Apache拦截或捕获来自后端服务器的302(或30x)响应并在内部重定向而不向客户端发送30x响应?最终,响应被重定向到的后端服务器将无法从外部访问(或未在Apache conf中列出).
我的情况:
我有web_server_A和web_server_B正在侦听端口6666和7777.这些端口无法从外部访问,但可以从内部访问.
我最终可以更改web_server_A的行为,但不能更改web_server_B的行为.
Apache正在侦听端口80/443,可从外部访问,并充当反向代理,将发送到web_server_ {A,B} .example.com的请求发送到web_server_ {A,B}
客户端向Apache请求web_server_A.example.com/foo.Apache将请求代理到web_server_A,后者生成一些内容,然后将指向web_server_B.example.com/bar/secret_token的HTTP/302响应发送回Apache.Apache向客户端发回302响应,然后向Apache发送web_server_B.example.com/bar/secret_token的HTTP请求.Apache将请求代理到web_server_B,后者回复了一些内容(通常会发回一些大文件).
我的问题:
我不希望客户端知道url web_server_B.example.com/bar/secret_token,最终我不希望从外部访问web_server_B.
web_server_A可以向web_server_B发出请求,然后从web_server_B发回答案,而不发出302回复.但是,web_server_B的答案可能需要一些时间,可能会非常大,而web_server_A不应该在任何请求上花费太多时间(它无法处理大文件).
所以我想到了一个"302捕手"功能,如果存在的话会很好,但到目前为止还没有在网上为如何做到这一点提供任何资金.任何的想法?
我必须将我的Web应用程序从apache移植到IIS 7,并在正确的配置中遇到麻烦.
在apache配置中,我配置了一些mod重写内容(为了与apache active mq通信),如下所示:
#Reverse-Proxy to ActiveMQ AJAX-Interface
ProxyPass /foo/bar/amq http://localhost:8161/foo/amq/
ProxyPassReverse /foo/bar/amq http://localhost:8161/foo/amq/
ProxyPassReverseCookiePath /foo /
Run Code Online (Sandbox Code Playgroud)
我试图使用ApplicationRequestRouting配置IIS 7 .将/ foo/bar替换为localhost地址的请求中的重写规则确实有效,但是我在定义用于在响应中设置正确的cookie路径的规则时遇到了一些问题.
我已经找到了一篇关于在这里操纵回复的文章.对我来说,看起来像II7我只能操纵响应的HTTP主体.
如何以编辑cookie路径的方式操作响应头?
响应头中的cookie路径如下所示:
Set-Cookie: JSESSIONID=1lu7hn253csbh11jax27k2i072;Path=/foo
Run Code Online (Sandbox Code Playgroud)
路径应编辑为"Path = /".
感谢您的时间和您的帮助罗尔夫
我有一个apache服务器,在我们的DMZ中作为反向代理.我们有一个外部服务,可以回发到此服务器上的特定URL.此服务现在需要回发到一个全新的应用程序,但由于我们现在处于测试阶段,因此很可能在不久的将来再次发生变化.
因此,要解决此问题,我正在尝试接收传入的回发请求/smsPostback.php,并将其重写为新的相对URL /SMSHandler/Process.这部分正在运作.
无论如何在配置中直接定义,我都有一个ProxyPass指令来代理/SMSHandler到内部服务器的所有流量.
这些是apache conf文件中的新行:
RewriteRule ^/smsPostback.php$ /SMSHandler/Process
##Proxy pass smshandler
ProxyPass /SMSHandler http://172.29.61.49:8080/SMSHandler
ProxyPassReverse /SMSHandler http://172.29.61.49:8080/SMSHandler
Run Code Online (Sandbox Code Playgroud)
这些是重写日志中的日志:
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) init rewrite engine with requested uri /smsPostback.php
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (3) applying pattern '^/smsPostback.php$' to uri '/smsPostback.php'
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) rewrite '/smsPostback.php' -> '/SMSHandler/Process'
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) local path result: /SMSHandler/Process
172.29.61.49 - - [24/Jan/2012:18:43:36 --0500] [test.hidden.com/sid#5eace0][rid#446b770/initial] (2) …Run Code Online (Sandbox Code Playgroud) 这是我的情景:

所以,
https://server1/MyPerlApphttps://server1/MyPerlApp到http://server2:5000问题1:这可能吗?(问,因为我不太了解Apache,这不是一个简单的:
ProxyPass /MyPerlApp http://server2:5000/
Run Code Online (Sandbox Code Playgroud)
因为我需要在server1上验证用户身份,并ProxyPass在验证时设置Only.由于Apache非常灵活,我认为上面的答案是肯定的(但确认和细节非常受欢迎) - 所以这是我的主要具体问题:
perl服务器2上的应用程序的简单方法?例如,使用Apache 为每个查询mod_rewrite附加一个user=username参数,perl应用应该读取的一些HTTP标头吗?我正在寻找如何避免我的starman/perl应用程序中的身份验证例程,因为:
已经有类似的问题,但是:
我一直在寻找,但没有找到一个人在同一台服务器上托管多个节点网站而不使用子域.我想要以下类似的东西......
website.com/app1 - > 127.0.0.1:3000
website.com/app2 - > 127.0.0.1:9000
upstream node {
server 127.0.0.1:3000;
keepalive 64;
}
server {
listen 80;
server_name webaddress.com;
root /var/www/trucks/;
location /livereload {
proxy_pass http://localhost:35729;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location /app1 {
rewrite ^/app1/?(.*) /$1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:3000;
root /var/www/trucks;
}
Run Code Online (Sandbox Code Playgroud)
我甚至尝试重写请求; 但是,这似乎没有任何影响.如果我删除/ app1它可以正常工作.我得到的最接近的是转发到多个站点,但当地快递路线无效.
有没有什么方法可以让 ASP.NET 应用程序能够在通过反向代理/网关的请求上下文中导出其 url 路径和主机名,了解其自己的路由?
通过网关请求此 url 时:
http://conoso.com/behind/some/reverseproxy/api/values/
Run Code Online (Sandbox Code Playgroud)
网关正在将请求重新路由到其他位置:
http://10.0.0.0/api/values
Run Code Online (Sandbox Code Playgroud)
它使用 DefaultApi 路由访问以下 ApiController ValuesController 的 Get 方法:
// GET api/values
public HttpResponseMessage Get()
{
var res = Request.CreateResponse();
res.Headers.Add(
"Location",
Url.Link(
"DefaultApi",
new
{
id = 1
}));
return res;
}
Run Code Online (Sandbox Code Playgroud)
它返回以下标头值:
Location: http://10.0.0.0/api/values/1
Run Code Online (Sandbox Code Playgroud)
虽然我希望发送以下有效路径:
Location: http://conoso.com/behind/some/reverseproxy/api/values/1
Run Code Online (Sandbox Code Playgroud)
使用框架中内置方法的替代方法是手动格式化字符串:
var baseUrl = "http://conoso.com/behind/some/reverseproxy";
string.Format("{0}/values/1", baseUrl);
Run Code Online (Sandbox Code Playgroud)
但这会散发出一些邪恶的代码味道。有人可以建议更清洁的方法吗?
我在使用 apache 作为 Node JS/Express REST API 之上的反向代理时遇到问题。
当我向我代理的 URL 发出 PUT 请求时,apache 似乎会响应 405 Method not allowed 响应,而不是将请求转发到服务。我可以毫无问题地发出 GET 和 POST 请求。
如果我直接将请求发送到 API(http://ip-address:port),一切都会正常进行。另外,如果我从服务器本身向域发出请求,它就可以正常工作。
API 中禁用了 CORS。
<VirtualHost example.domain.local:80>
ProxyPreserveHost On
ProxyPass / http://192.168.1.40:9020/
ProxyPassReverse / http://192.168.1.40:9020/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
当我检查请求时,我可以看到 HTTP 允许标头设置为 GET、HEAD、POST、OPTIONS、TRACE。所以我尝试使用虚拟主机指令内的指令更改它。
<Proxy "*">
Order deny,allow
Allow from all
AllowMethods GET PUT DELETE POST
</Proxy>
Run Code Online (Sandbox Code Playgroud)
但没有任何变化。我还在 Proxy 指令中尝试了 LimitExcept 指令,但这没有什么区别。
我还检查了所有 httpd.conf,但没有看到任何可疑的配置。
我完全陷入困境,有人熟悉此类问题吗?
附上SAMLContextProviderLB bean的上下文提供程序
**<property name="scheme" value="https"/>**
<property name="serverName" value="${sp.hostname}"/>
<property name="serverPort" value="#{'${sp.ssl.port}'=='' ? 443 : '${sp.ssl.port}'}"/>
<property name="includeServerPortInRequestURL" value="#{'${sp.ssl.port}'=='443' ? false : true }"/>
<property name="contextPath" value="/${sp.context.root}"/>
Run Code Online (Sandbox Code Playgroud)
我在反向代理服务器后面,所以我正在卸载SSL终端.后端服务器本身正在侦听非SSL,但是webtier正在为我们终止SSL并转发到非ssl端口.我已经设置了具有上述属性的SAMLContextProviderLB,因此即使后端是https,它也会知道将saml令牌的预期收件人映射为https受众.然而,当我访问受保护资源时,我在下面的日志中看到了它在浏览器上返回的垃圾.当我在浏览器中将其更改为https时,它可以按预期工作.查看下面的日志显示,当 DefaultSavedRequest url 应该是HTTP时,从DefaultSavedRequest url返回的值是HTTP.
2016-03-07 18:24:11,907 INFO org.springframework.security.saml.log.SAMLDefaultLogger.log:127 - AuthNResponse; SUCCESS; 10.4.203.88; https:// myserver:89/fct; https://www.myADFS.com/adfs/services/trust; camachof@email.com ;;
2016-03-07 18:24:11,909 DEBUG org.springframework.security.saml.SAMLProcessingFilter.successfulAuthentication:317 - 身份验证成功.更新SecurityContextHolder以包含:org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237:校长:camachof@email.com; 证书:[保护]; 认证:真实; 细节:null; 没有授予任何权力
2016-03-07 18:24:11,910 DEBUG org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess:79 - 重定向到DefaultSavedRequest网址:http:// myserver:89/fct/page
2016-03-07 18:24:11,911 DEBUG org.springframework.security.web.DefaultRedirectStrategy.sendRedirect:36 - 重定向到' http:// myserver:89/fct/page '
2016-03-07 18:24:11,911 DEBUG …
我在使用 Nginx 作为反向代理设置 apache superset 时遇到问题(这可能是 nginx 配置错误)。
服务器配置块(如果我缺少某些内容,请告诉我,我会添加它):
server {
listen 80 default_server;
server_name _;
root /var/www/data;
error_log /var/www/bokehapps/log/nginx.error.log info;
location /static {
alias /usr/lib/python2.7/site-packages/bokeh/server/static;
}
location /superset {
proxy_pass http://0.0.0.0:8088;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
}
Run Code Online (Sandbox Code Playgroud)
我能够进入 0.0.0.0:8088 以获得重定向页面,并且我的请求正在将其发送到 werkzeug。但在我的浏览器中,一切都是 404。
我有站点https://a-b-c.com并分别在端口和https://www.x-y-z.com上的反向代理后面运行。44445555
我将它们配置为使用 LetsEncrypt TLS 证书,但现在使用反向代理时出现错误,我认为我需要使用&tls.config{}包含其证书的证书,但我不知道如何设置它。
我的反向代理看起来像:
director := func(req *http.Request) {
log.Println(req.Host)
switch req.Host {
case "a-b-c-.com":
req.URL.Host = "localhost:4444"
req.URL.Scheme = "https"
case "x-y-z.com":
req.URL.Host = "localhost:5555"
req.URL.Scheme = "https"
}
proxy := &httputil.ReverseProxy{Director: director}
proxy.Transport = &http.Transport{
Proxy: http.ProxyFromEnvironment,
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
log.Fatalln(http.ListenAndServe(":443", proxy))
Run Code Online (Sandbox Code Playgroud) reverse-proxy ×10
apache ×4
express ×2
nginx ×2
ssl ×2
asp.net-mvc ×1
c# ×1
centos ×1
cookies ×1
go ×1
http-headers ×1
iis ×1
java ×1
mod-rewrite ×1
node.js ×1
perl ×1
plack ×1
psgi ×1
python ×1
redirect ×1
spring-saml ×1
urlhelper ×1