我在 Karaf 托管的应用程序前部署 Apache(Apache 和 Karaf 在不同的服务器上)。我希望 Apache 作为反向代理运行并隐藏部分 URL。
直接从应用服务器获取应用登录页面的 URL 是http://app-server:8181/jellyfish. 页面由在 Karaf 中运行的 Jetty 实例提供服务。当然,这种行为通常会被防火墙阻止,除了反向代理服务器。
在关闭防火墙的情况下,如果您点击此 URL,则 Jetty 会加载登录页面。浏览器的地址栏正确更改为http://app-server:8181/jellyfish/login?0,一切正常。
我想要的是http://web-server(即从根)映射到应用程序服务器上的 Jetty,应用程序的名称 ( jellyfish) 被抑制。例如,浏览器将更改为显示http://web-server/login?0在地址栏中,并且所有后续 URL 和内容都将使用网络服务器的域提供服务,而不会出现jellyfish混乱。
我可以使用以下配置(代码段)让 Apache 作为简单的反向代理运行:-
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
Run Code Online (Sandbox Code Playgroud)
...但这需要浏览器的 URL 包含jellyfish并转到根 URL ( http://web-server) 会给出 404 Not Found。
我花了很多时间尝试使用mod_rewrite和不使用它的[P]标志来解决这个问题,但没有成功。然后我尝试了该ProxyPassMatch指令,但我似乎也无法完全正确。
这是当前配置,已加载到/etc/apache2/sites-available/Web 服务器上。请注意,有一个本地托管的图像目录。我还保留了mod_rewrite 代理漏洞利用保护,并抑制了一些mod_security会产生误报的规则。
<VirtualHost *:80> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用有趣的 Apache mod_rewrite 设置转换反向代理以使用 Nginx(由于外部问题,我们正在从 Apache 迁移到 Nginx,除了这部分外,大多数一切都正常)。
我最初的设置是读取 HTTP cookie(由某些应用程序设置)并根据其值将反向代理定向到不同的后端。它是这样的:
RewriteCond %{HTTP_COOKIE} proxy-target-A
RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA]
RewriteCond %{HTTP_COOKIE} proxy-target-B
RewriteRule ^/original-request http://backend-b/another-application [P,QSA]
RewriteRule ^/original-request http://primary-backend/original-application [P,QSA]
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 Nginx 实现相同的目标,我的初始配置是这样的(其中“proxy_override”是 cookie 的名称):
location /original-request {
if ($cookie_proxy_override = "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($cookie_proxy_override = "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
Run Code Online (Sandbox Code Playgroud)
但它没有。我试图通过编写主代理重定向到基于${cookie_proxy_override}的内容来查看 Nginx 是否可以读取我的 cookie ,我可以看到它读取的内容很好,但ifs 似乎总是失败。
根据 Rikih 的回答,我的下一次尝试是这样的:
location /original-request {
if ($http_cookie ~ "proxy-target-A") …Run Code Online (Sandbox Code Playgroud) 我正在使用 nginx 作为反向代理来为仅 https 站点提供服务。因此,我希望将此站点的 cookie 标记为安全。但是后端服务器是一个 http 服务器,因此它不会为其 cookie 设置安全标志。如何修改 Set-Cookie 标头以响应添加安全标志?
我正在尝试配置 nginx,以便它proxy_pass向我的节点应用程序发出请求。关于 StackOverflow 的问题得到了很多赞成:https ://stackoverflow.com/questions/5009324/node-js-nginx-and-now ,我正在使用那里的配置。
(但由于问题是关于服务器配置,它应该在 ServerFault 上)
这是nginx配置:
server {
listen 80;
listen [::]:80;
root /var/www/services.stefanow.net/public_html;
index index.html index.htm;
server_name services.stefanow.net;
location / {
try_files $uri $uri/ =404;
}
location /test-express {
proxy_pass http://127.0.0.1:3002;
}
location /test-http {
proxy_pass http://127.0.0.1:3003;
}
}
Run Code Online (Sandbox Code Playgroud)
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3003, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3003/');
Run Code Online (Sandbox Code Playgroud)
有用! 检查:http : //services.stefanow.net/test-http
var express = require('express');
var app = …Run Code Online (Sandbox Code Playgroud) 我有几个 API 端点,我想从一个位置下/api提供服务,子路径指向不同的端点。具体来说,我希望 webdis/api可以在/api/mypath.
我不担心与 webdis API 发生冲突,因为我使用的子路径不太可能与 redis 命令名称发生冲突,并且还可以完全控制 API 的设计以避免冲突。
这是我一直在攻击的测试服务器的配置文件:
server {
listen 80;
server_name localhost;
server_name 192.168.3.90;
server_name 127.0.0.1;
location / {
root /home/me/src/phoenix/ui;
index index.html;
}
# temporary hardcoded workaround
location = /api/mypath/about {
proxy_pass http://localhost:3936/v1/about;
}
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:7379/;
}
# tried this but it gives "not found" error
#location ^~ /api/mypath/ {
# rewrite ^/api/mypath/(.*)$ /$1 break;
# proxy_pass http://localhost:3936/v1/;
#} …Run Code Online (Sandbox Code Playgroud) 我正在与一个组织合作,该组织已部署 Varnish 作为其所有 Web 流量的缓存反向代理。他们的流量由大量客户生成的动态网站组成,通常收集静态资产。
虽然我试图喜欢 varnish(原则上我认为它有一个非常好的架构),但我在管理它和解决出现的问题时遇到了一些麻烦,所以我想知道它是否真的是正确的选择。之前我用squid做反向代理,但是作用不同,所以没有比较明确的依据。
我的问题针对在生产中部署了 varnish 或针对替代方案认真评估它的人:您是坚持使用 varnish,还是最终使用了另一个反向代理?你坚持或转换的关键点是什么,如果你确实使用了其他东西,你最终使用了什么?
我有一个需要反向代理站点的 Apache Web 服务器。所以example.com/test/或example.com/test从同一个其他网络服务器中提取。我已经为没有斜杠的那个设置了一个反向代理,如下所示:
ProxyPass /test http://othersite.com/test
ProxyPassReverse /test http://othersite.com/test
Run Code Online (Sandbox Code Playgroud)
但它不适用于尾随斜线。
有任何想法吗?我试过从 重定向/test/到/test没有运气。
谢谢。
在 Apache 上,您可以 ProxyPass 除了一个或多个子目录(带有“!”)之外的所有内容。
ProxyPass /subdir !
ProxyPass / http://localhost:9999/
Run Code Online (Sandbox Code Playgroud)
什么是 Nginx 等价物?
我的第一个猜测显然不起作用:
location /subdir {
root /var/www/site/subdir;
}
location / {
proxy_pass http://localhost:9999/ ;
}
Run Code Online (Sandbox Code Playgroud) 我有一个虚拟主机设置为重定向ntung-gitblit.localhost--> myserver:1279。但是,它不适用于前向编码斜杠 ( %2f)。我试图访问的 URL 是,
http://ntung-gitblit.localhost/ABC%2fXYZ
Run Code Online (Sandbox Code Playgroud)
没有AllowEncodedSlashes,它会失败——apache 尝试/error/HTTP_NOT_FOUND.html.var在服务器上访问。设置AllowEncodedSlashes为On导致以下内部 URL 命中,
http://myserver:1279/ABC/XYZ
Run Code Online (Sandbox Code Playgroud)
并设置AllowEncodedSlashes为NoDecode导致以下 URL 被命中,
http://myserver:1279/ABC%252fXYZ
Run Code Online (Sandbox Code Playgroud)
换句话说,它是过度逃逸或逃逸不足。问题:如何让它命中myserver:1279/ABC%2fXYZ?
我有一个 NGINX 作为反向代理。我需要从 URL 中删除子字符串 string_1,URL 的其余部分是可变的。
例子:
Origin: http://host:port/string_1/string_X/command?xxxxx
Destination: http://internal_host:port/string_X/command?xxxxx
Run Code Online (Sandbox Code Playgroud)
nginx.conf:
location /string_1/ {
proxy_pass http://internal_host:port/$request_uri$query_string;
Run Code Online (Sandbox Code Playgroud)
谢谢,
@pcamacho
reverse-proxy ×10
nginx ×6
apache-2.2 ×3
mod-rewrite ×2
cookie ×1
http-headers ×1
linux ×1
mod-proxy ×1
node.js ×1
proxy ×1
proxypass ×1
regex ×1
squid ×1
varnish ×1
web-server ×1